1

我有以下代码:

s.settimeout( 300 )
while notend:
   data = s.recv()       
   datacheck()
   ...

上面的代码在线程上运行,因此如果用户将notend变量设置为 False,线程将结束。但在这种情况下,它不会立即退出,它需要 300 秒才能退出,因为该recv功能。怎么能退出这个线程?

# Wait all the threads
for thread in threading.enumerate():
   if thread is not threading.currentThread():
       thread.join()
4

3 回答 3

2

问题是,如果您有一个阻塞套接字,recv()它将在整个超时期间阻塞。您可以指定更短的超时时间,但这可能不是您想要做的(如果 ping 真的是数千毫秒怎么办?)。

您可以使用一个对象以更频繁的速率(更小的超时)轮询感兴趣的套接字,而不是简单地尝试recv()一整天,并且仅在轮询报告有一些数据要读取时才调用。在轮询之间,如果您发现任何时候现在是错误的,您都可以跳出轮询循环。select.pollrecv()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

于 2013-02-20T09:56:42.460 回答
1

简单的答案 - 从另一个线程关闭 s。然后 recv() 调用将返回错误,因此允许调用它的线程清理并终止。

不需要超时,select() 等。

于 2013-02-20T10:35:03.743 回答
0

使用socket.settimeout因为recv它是一种阻塞方法

于 2013-02-20T09:44:14.530 回答