У меня есть класс, который подклассы 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()
для него?