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

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

最佳答案

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

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

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

以下是所描述功能的引用:

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

关于python - 如何在接收期间关闭 TCP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14976602/

相关文章:

python - 对列表列表进行排序的方法?

c++ - 将线程的结果转储到 vector 中是否线程安全?

c - C 网络编程(数据未使用 send() 从客户端发送到服务器)

c - 在 C 中立即(逐个数据包)从套接字接收 TCP 有效负载

c - select() 是否保证所有数据都可用于从套接字读取或仅部分数据

python - 如何迭代元组或函数列表并对其返回值进行操作?

python - linux中C的配置文件

python - 降维后使用选定的变量会引发值错误

java - 线程 : How do I know which thread a method runs in?

Android 后台服务类 "onStartCommand"方法在设备启动时不执行其中的所有代码