python .select 正在阻塞
python .select is blocking
我有一个服务器套接字,用于侦听传入连接并为每个客户端创建新套接字。我有一个 while 循环来保持服务器负责(能够在没有连接传入时使用按钮关闭它),为此我使用 .select
检查是否有任何连接。我遇到的问题是 .select
由于某种原因被阻止。它一直等到有连接,而不是检查连接然后继续。
def serverstart(self):
self.buttonswitch("1")
self.host = self.intip
self.port = 5000
s = socket.socket(socket.AF_INET6)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setblocking(0)
s.bind((self.host, self.port))
inputs = [ s ]
s.listen(5)
self.serverstatus = "1"
while s:
inputready, outputready, exceptready = select.select(inputs, [], [] )
if inputready == inputs and self.serverstatus == "1":
print inputready
c, addr = s.accept()
ct = threading.Thread(target=self.client_thread, args=[c, addr])
ct.start()
if self.serverstatus == "0":
break
s.close()
print "Closing socket"
self.buttonswitch("0")
编辑:
为工作的非阻塞select解决方案添加了超时
inputready, outputready, exceptready = select.select(inputs, [], [], 0.1 )
select
的第四个参数是超时。根据文档:
The optional timeout argument specifies a time-out as a floating point number in seconds. When the timeout argument is omitted the function blocks until at least one file descriptor is ready.
如果您想避免默认行为,您应该修改您的调用以包含可选参数。 select(inputs, [], [], 1)
,例如
我有一个服务器套接字,用于侦听传入连接并为每个客户端创建新套接字。我有一个 while 循环来保持服务器负责(能够在没有连接传入时使用按钮关闭它),为此我使用 .select
检查是否有任何连接。我遇到的问题是 .select
由于某种原因被阻止。它一直等到有连接,而不是检查连接然后继续。
def serverstart(self):
self.buttonswitch("1")
self.host = self.intip
self.port = 5000
s = socket.socket(socket.AF_INET6)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setblocking(0)
s.bind((self.host, self.port))
inputs = [ s ]
s.listen(5)
self.serverstatus = "1"
while s:
inputready, outputready, exceptready = select.select(inputs, [], [] )
if inputready == inputs and self.serverstatus == "1":
print inputready
c, addr = s.accept()
ct = threading.Thread(target=self.client_thread, args=[c, addr])
ct.start()
if self.serverstatus == "0":
break
s.close()
print "Closing socket"
self.buttonswitch("0")
编辑:
为工作的非阻塞select解决方案添加了超时
inputready, outputready, exceptready = select.select(inputs, [], [], 0.1 )
select
的第四个参数是超时。根据文档:
The optional timeout argument specifies a time-out as a floating point number in seconds. When the timeout argument is omitted the function blocks until at least one file descriptor is ready.
如果您想避免默认行为,您应该修改您的调用以包含可选参数。 select(inputs, [], [], 1)
,例如