我正在阅读socketserver.py代码,并且我发现它正在使用selectors.PollSelector(如果可用)。但是在主套接字或tcp连接套接字上没有setblocking(0)。有人可以解释为什么套接字设置为阻塞,因为它是默认套接字行为?
修改
我做了很少的测试,我甚至应该更改标题......但是当你选择使用select时,socket是否处于阻塞状态是否重要?因为在这段代码中,True setblocking上的/ false无效。
import sys
import socket
from time import sleep
import select
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1',9999))
s.setblocking(1) # does it matter?
s.listen(10)
timeout=100
inp = [s]
out = []
def worker(client,num):
print('Worker sending out',client,num)
client.send( str(str(num)+'\n').encode('utf-8'))
sleep(0.3)
server_client = {}
while True:
print('in loop')
try:
inputready,outputready,_ = select.select(inp,out,[],timeout)
for server in inputready:
if server == s:
print('accept',server)
client, address = server.accept()
client.setblocking(1) # does it matter?
inp.append(client)
out.append(client)
for server in outputready:
if server in server_client:
server_client[server] += 1
else:
server_client[server] = 0
worker(server,server_client[server])
except BlockingIOError:
print('ERR blocking')
pass
答案 0 :(得分:1)
对于select(),如果套接字/流/文件句柄阻塞或没有阻塞,则没有区别。 只读取或写入套接字,并且只有在没有可用数据的情况下,行为才会有所不同。