我有以下代码:
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()
答案 0 :(得分:2)
问题是,如果你有一个阻塞套接字,recv()
将在整个超时期间阻塞。您可以指定更短的超时,但这可能不是您想要做的(如果ping真的是几千毫秒怎么办?)。
您可以使用recv()
对象以更频繁的速率(较小的超时)轮询感兴趣的套接字,而不是仅仅整天尝试select.poll
,而只调用recv()
当轮询报告有一些数据要读取时。在民意调查之间,如果您发现notend
现在为假,则可以突破轮询循环。
如果您的平台不支持poll()
,请查看它是否支持select()
。然后,您可以使用select.select()
函数完成或多或少相同的任务。
以下是所述功能的参考:
http://docs.python.org/2/library/select.html#poll-objects http://docs.python.org/2/library/select.html#select.select
答案 1 :(得分:1)
简单回答 - 从另一个帖子关闭s。然后recv()调用将返回错误,因此允许调用它的线程清理并终止。
不需要超时,选择()等。
答案 2 :(得分:0)
使用socket.settimeout,因为recv
是阻止方法