【发布时间】:2016-12-05 15:30:44
【问题描述】:
我正在阅读 socketserver.py 代码,我发现它正在使用 selectors.PollSelector(如果可用)。但是主套接字或 tcp 连接套接字上没有 setblocking(0)。有人可以解释为什么套接字设置为阻塞,因为它是默认套接字行为吗?
编辑
我做了一些测试,我什至应该更改标题...但是当您选择使用 select 时,套接字是否处于阻塞状态有关系吗?因为在这段代码中,sn-p,True/False对 setblocking 无效。
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
【问题讨论】:
-
Sockets 被设置为阻塞通常是默认的,不仅仅是在
socketserver模块中,所以模块作者选择类似地实现默认值并不让我感到惊讶。然而,值得指出的是socketserver和socket模块都支持非阻塞模式。在套接字模块中可能更难识别,但要寻找“超时”。
标签: python sockets nonblocking socketserver