Многопоточность: несколько потоков собирают информацию, один работает - PullRequest
0 голосов
/ 30 апреля 2018

Я пишу код, который должен иметь следующую структуру:

  • несколько потоков собирают данные. Данные помещаются в буфер.
  • одновременно выполняет извлечение данных одним потоком из этого буфера, выполняет некоторую работу с ним и сохраняет его в другом буфере (доступ к нему имеет только этот поток).
  • рабочий поток завершается, только если все потоки "сборщика" завершены и все данные в буфере обработаны.

Может кто-нибудь дать мне какой-нибудь код / ​​псевдокод о том, как сделать что-то подобное. Главным образом о том, какой буфер я должен использовать и как потоки взаимодействуют так, чтобы все данные были собраны и обработаны правильно.

Я прочитал о классах "Queue" и "threading" в python. Тем не менее, я все еще не уверен, как это сделать правильно. Я пробовал несколько простых примеров с объектом threading.Event () - однако результаты противоречивы.

Большое спасибо!

1 Ответ

0 голосов
/ 30 апреля 2018

Если ваш работник видит, что сборщики выполнены, то это так же просто, как проверить, пока не завершены потоки ИЛИ очередь не пуста.

Если ваш работник не может видеть состояние сборщиков или даже их количество, вы можете попросить сборщиков передать это состояние в самой очереди по данным.

Представьте, что у объекта данных есть поле источника и логическое поле, помеченное как открытое или закрытое. Например, сборщик 1 отправит что-то вроде:

data-1-opened, data-1-opened ... data-1-closed.

Рабочий должен поддерживать только набор идентификаторов сборщика, добавляя новые записи по мере их появления и удаляя их при закрытии. Таким образом, условие выхода состоит в том, что набор пуст и очередь данных пуста.

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