我有以下代码:
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()
将在整个超时时间内阻塞。您可以指定更短的超时,但这可能不是您想要做的(如果 ping 确实是数千毫秒怎么办?)。
您可以使用 select.poll
对象以更频繁的频率(更短的超时时间)轮询感兴趣的套接字,而不是整天尝试 recv()
),并且仅当轮询报告有一些数据要读取时才调用 recv()
。在轮询之间,如果您发现 notend
现在为 false,则可以中断轮询循环。
如果您的平台不支持 poll()
,请查看它是否支持 select()
。然后,您可以使用 select.select()
函数来完成或多或少相同的任务。
以下是所描述功能的引用:
http://docs.python.org/2/library/select.html#poll-objects http://docs.python.org/2/library/select.html#select.select
关于python - 如何在接收期间关闭 TCP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14976602/