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

2024-10-03 02:39:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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

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

^{pr2}$

Tags: 函数代码用户falsedata情况线程while
3条回答

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

不需要超时、select()等

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

您可以使用一个select.poll对象,以更频繁的速率(较小的超时时间)轮询感兴趣的套接字,并且只有在轮询报告有要读取的数据时才会调用recv()。在两次轮询之间,如果在任何时候发现notend现在为false,则可以跳出轮询循环。在

如果您的平台不支持poll(),那么看看它是否支持select()。然后,您可以使用select.select()函数来完成或多或少相同的任务。在

以下是所述功能的参考:

http://docs.python.org/2/library/select.html#poll-objectshttp://docs.python.org/2/library/select.html#select.select

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

相关问题 更多 >