Python 如何在recv期间关闭TCP客户端?
我有以下代码:Python 如何在recv期间关闭TCP客户端?,python,multithreading,recv,Python,Multithreading,Recv,我有以下代码: s.settimeout( 300 ) while notend: data = s.recv() datacheck() ... 上面的代码在线程上运行,因此如果用户将notend变量设置为False,线程将结束。但在这种情况下,它不会立即退出,因为recv功能需要300秒才能退出。如何退出此线程 # Wait all the threads for thread in threading.enumerate(): if thread i
s.settimeout( 300 )
while notend:
data = s.recv()
datacheck()
...
上面的代码在线程上运行,因此如果用户将notend
变量设置为False,线程将结束。但在这种情况下,它不会立即退出,因为recv
功能需要300秒才能退出。如何退出此线程
# Wait all the threads
for thread in threading.enumerate():
if thread is not threading.currentThread():
thread.join()
利用,因为
recv
是一种阻塞方法问题是,如果您有阻塞套接字,recv()
将在整个超时期间阻塞。您可以指定更短的超时,但这可能不是您想要做的(如果ping真的是数千毫秒呢?)
您可以使用select.poll
对象以更频繁的速率(更小的超时)轮询感兴趣的套接字,而不是整天尝试recv()
,并且仅当轮询报告有一些数据要读取时才调用recv()
。在两次轮询之间,如果您在任何一点上发现notend
现在为false,则可以中断轮询循环
如果您的平台不支持poll()
,请查看它是否支持select()
。然后,您可以使用select.select()
函数完成大致相同的任务
以下是所述功能的参考:
简单答案-从另一个线程关闭s。recv()调用将返回一个错误,因此允许调用它的线程清理并终止
不需要超时,选择()等。看起来他是:
s.settimeout(300)
我知道这是一个阻塞功能,服务器有300秒的时间开始发送测量数据,如果有超时,我将重新启动测量。你确定这就是问题所在吗recv
需要一个参数:socket.recv(bufsize)
,否则会引发TypeError
。你能再给我们看一点代码吗?是的,缓冲区大小在那里,我只是忘了在采样代码中包括我的问题是,它只支持Unix系统poll()系统调用,在大多数Unix系统上受支持@iUngi你的平台有select()
?大多数平台(包括Windows)都应该。select()
调用完成相同的任务,但语义略有不同。(答案更新)我刚刚测试过,它工作正常,但我不得不使用关闭
,因为关闭没有效果。谢谢这个消息。关闭/关机/随便什么,只要工作正常,我就可以!