我有一个类,它是threading.Thread
的子类。它唯一的职责就是将从UNIX命名管道读取的消息放入queue.Queue
对象中(以便其他线程稍后可以处理这些值)。
示例代码:
class PipeReaderThread(Thread):
def __init__(self, results_queue, pipe_path):
Thread.__init__(self)
self._stop_event = Event()
self._results_queue = results_queue
self._pipe_path = pipe_path
def run(self):
while not self._stop_event.is_set():
with open(self._pipe_path, 'r') as pipe:
message = pipe.read()
self._results_queue.put(message, block=True)
def stop(self):
self._stop_event.set()
从上面的代码中可以看到,我想使用一个threading.Event
对象来停止循环,但由于命名管道上的open()
或read()
调用会阻塞(直到有人打开该管道进行写操作/写入内容,然后关闭它),所以线程永远没有机会停止。
我不想使用命名管道的非阻塞模式,因为实际上阻塞是我想要的,因为我希望等待有人打开并写入管道。
对于套接字,我可能会尝试设置套接字上的超时标志,但我找不到任何可以在命名管道上执行此操作的方法。 我也考虑过不给线程任何机会就冷血杀死它,但这不是我应该做的事情,而且我甚至不知道Python是否提供了这样的方式。
我应该如何适当地停止这个线程,以便之后可以调用join()
呢?