Python : how to stop a thread that's waiting for a . recv()

标签 python multithreading

我有这个线程运行:

def run(self):
    while 1:
        msg = self.connection.recv(1024).decode()

我希望当我像这样关闭 Tkinter 窗口时可以结束这个线程:
self.window.protocol('WM_DELETE_WINDOW', self.closeThreads)

def closeThreads(self):
    self.game.destroy()
    #End the thread

不能使用 thread._close() 因为它已被弃用并且 python 3.4 不允许它。

最佳答案

对于这个问题,我见过的唯一真正令人满意的解决方案是不允许您的线程在 recv() 中阻塞。相反,将套接字设置为非阻塞并在 select() 中使用线程块。在 select() 中阻塞的好处是,当几个套接字中的任何一个准备好读取时,您可以告诉 select() 返回,这将我们带到下一部分:作为设置线程的一部分,创建第二个套接字(本地连接的 TCP 套接字,例如由 socketpair 提供的,或监听来自本地主机的数据包的端口的 UDP 套接字)。当您的主线程希望您的网络线程离开时,您的主线程应该向该套接字发送一个字节(或者在 TCP 情况下,主线程可以关闭其套接字对的末端)。这将导致 select() 在该套接字上返回ready-for-read,并且当您的网络线程意识到该socket 被标记为ready-for-read 时,它应该通过立即退出来响应。

这样做的优点是它在所有操作系统上都能很好地工作,总是立即使用react(与轮询/超时解决方案不同),当网络空闲时占用零额外的 CPU 周期,并且在多线程环境。缺点是它使用了几个额外的套接字,但这通常不是什么大问题。

关于Python : how to stop a thread that's waiting for a . recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512846/

相关文章:

python - 有没有办法在gpu计算的时候并行加载数据?

python - 类型错误 : not indexable

c++ - c++11线程引入了什么样的开销?

c++ - 将包含多个类型变量的 PVOID 数组传递给 _beginthreadex()

java - Jersey Client WebTarget 是线程安全的吗?

python - memcache.get -> gae_override.httplib 上出现一系列错误

python - 阿皮姆 : Getting exception while running tests

python - 为什么 Windows 上的 ProcessPoolExecutor 在从另一个模块提交函数时需要 __main__ 守卫?

java - Java 应用程序中的线程

ios - 是否有必要在这里使用 dispatch_queue