如何在recv期间关闭TCP客户端?

时间:2013-02-20 09:40:30

标签: 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 is not threading.currentThread():
       thread.join()

3 个答案:

答案 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是阻止方法