2024-10-03 02:39:35 发布
网友
我有以下代码:
s.settimeout( 300 ) while notend: data = s.recv() datacheck() ...
上面的代码是在线程上运行的,因此如果用户将notend变量设置为False,则线程将结束。但在这种情况下,它不会立即退出,它需要300秒才能退出,因为recv函数。如何退出此线程?在
notend
recv
简单回答-从另一个线程关闭s。recv()调用将返回一个错误,因此允许调用它的线程清理并终止。在
不需要超时、select()等
问题是,如果您有一个阻塞套接字,recv()将在整个超时期间阻塞。您可以指定一个较短的超时,但这可能不是您想要的(如果ping真的是几千毫秒呢?)。在
recv()
您可以使用一个select.poll对象,以更频繁的速率(较小的超时时间)轮询感兴趣的套接字,并且只有在轮询报告有要读取的数据时才会调用recv()。在两次轮询之间,如果在任何时候发现notend现在为false,则可以跳出轮询循环。在
select.poll
如果您的平台不支持poll(),那么看看它是否支持select()。然后,您可以使用select.select()函数来完成或多或少相同的任务。在
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是一种阻塞方法
简单回答-从另一个线程关闭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
是一种阻塞方法相关问题 更多 >
编程相关推荐