优雅地终止Python线程

Geo*_*rge 15 python multithreading

我正在尝试编写一个侦听套接字,stdin和从文件描述符读取的unix客户端程序.我将每个任务分配给一个单独的线程,并使用同步队列和信号量成功地与"主"应用程序通信.问题是,当我想关闭这些子线程时,它们都会在输入时阻塞.此外,线程无法在线程中注册信号处理程序,因为在Python中只允许执行主线程.

有什么建议?

Nix*_*Nix 8

没有好办法解决这个问题,特别是当线程阻塞时.

我有一个类似的问题(Python:如何终止阻塞线程),我能够阻止我的线程的唯一方法是关闭底层连接.这导致阻塞引发和异常的线程然后允许我检查停止标志并关闭.

示例代码:

class Example(object):
   def __init__(self):
       self.stop = threading.Event()
       self.connection = Connection()
       self.mythread = Thread(target=self.dowork)
       self.mythread.start()     
   def dowork(self):

        while(not self.stop.is_set()):
             try:
                  blockingcall()        
             except CommunicationException:
                  pass
   def terminate():
       self.stop.set()
       self.connection.close()
       self.mythread.join()
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的事情是通常阻塞操作通常会提供超时.如果您有这个选项,我会考虑使用它.我的最后一点评论是你总是可以将线程设置为deamonic,

来自pydoc:

线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.可以通过守护程序属性设置该标志.

  • 请注意,触摸另一个线程正在使用的文件描述符并不安全,并且它可能导致比另一个线程中的异常更糟糕的事情.您应该使用非阻塞I/O. (2认同)