Очередь связи между python потоками не работает - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь получить объект, который инициирует поток с общей очередью. Ниже приведено представление о том, чего я пытаюсь достичь с его помощью.

from multiprocessing import Queue
from queue import Empty
from threading import Thread


class thread_writer(Thread):
    def __init__(self, queue):
        super().__init__()
        self._write_queue = queue

    def run(self) -> None:
        idx = 0
        while True:
            self._write_queue.put(idx)
            idx += 1


class thread_reader:
    def __init__(self):
        self._read_queue = Queue()
        self._writer = thread_writer(self._read_queue)
        self._writer.run()

        while True:
            try:
                q_msg = self._read_queue.get()
                print(q_msg)
            except Empty():
                pass


if __name__ == '__main__':
    test = thread_reader()

По существу, поток записи непрерывно записывает в очередь, тогда как объект чтения инициирует поток и непрерывно читает из очереди. Однако ничего не печатается. Любая идея, что я делаю здесь не так?

Я получаю следующую трассировку при выходе из программы:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/daniel/Work/ss15m22_sw/sw_test/lib/test.py", line 23, in __init__
    self._writer.run()
  File "/home/daniel/Work/ss15m22_sw/sw_test/lib/test.py", line 14, in run
    self._write_queue.put(idx, )
  File "/usr/lib/python3.6/multiprocessing/queues.py", line 82, in put
    if not self._sem.acquire(block, timeout): 

1 Ответ

1 голос
/ 16 марта 2020

Проблема в том, что вы вызываете метод run() напрямую. вызовите метод start(), который вызовет run() в отдельном потоке управления.

class thread_reader:
    def __init__(self):
        self._read_queue = Queue()
        self._writer = thread_writer(self._read_queue)
        self._writer.start() # changed

        while True:
            try:
                q_msg = self._read_queue.get()
                print(q_msg)
            except Empty():
                pass

Из Python документов,

После создания объекта потока , его активность должна начинаться с вызова метода start () потока. Это вызывает метод run () в отдельном потоке управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...