我有这个线程运行:
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/