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

Python 如何在recv期间关闭TCP客户端?,python,multithreading,recv,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 i

我有以下代码:

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()

利用,因为
recv
是一种阻塞方法

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

您可以使用
select.poll
对象以更频繁的速率(更小的超时)轮询感兴趣的套接字,而不是整天尝试
recv()
,并且仅当轮询报告有一些数据要读取时才调用
recv()
。在两次轮询之间,如果您在任何一点上发现
notend
现在为false,则可以中断轮询循环

如果您的平台不支持
poll()
,请查看它是否支持
select()
。然后,您可以使用
select.select()
函数完成大致相同的任务

以下是所述功能的参考:


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


不需要超时,选择()等。

看起来他是:
s.settimeout(300)
我知道这是一个阻塞功能,服务器有300秒的时间开始发送测量数据,如果有超时,我将重新启动测量。你确定这就是问题所在吗
recv
需要一个参数:
socket.recv(bufsize)
,否则会引发
TypeError
。你能再给我们看一点代码吗?是的,缓冲区大小在那里,我只是忘了在采样代码中包括我的问题是,它只支持Unix系统
poll()系统调用,在大多数Unix系统上受支持
@iUngi你的平台有
select()
?大多数平台(包括Windows)都应该。
select()
调用完成相同的任务,但语义略有不同。(答案更新)我刚刚测试过,它工作正常,但我不得不使用
关闭
,因为关闭没有效果。谢谢这个消息。关闭/关机/随便什么,只要工作正常,我就可以!