Создание управляемых событиями потоков - PullRequest
0 голосов
/ 17 июля 2011

Я пробовал все виды решения следующей проблемы; безрезультатно.

У меня есть большое количество (python) модулей / скриптов и выдающийся скрипт K.py.

Когда выполняется K.py, он генерирует некоторую информацию, например, название страны. Теперь среди других модулей (сотен) будут модули, которые могут быть выполнены с информацией (название страны, для этого примера), сгенерированной K.py, переданной им в качестве входных данных. Рекурсивно, каждый из вышеперечисленных модулей будет генерировать некоторую информацию (названия городов, номера улиц и т. Д.), Которая может служить входом для других модулей и т. Д. Это, конечно, приведет к выполнению двоичного дерева скриптов ..

Очки к сведению.

  • Модули / скрипты (сотни), приведенные выше, могут работать независимо (они никак не зависят друг от друга)
  • Я смогу вынести вердикт, когда все модули закончили выполнение (при запуске K.py должен блокироваться до тех пор, пока сработавшее двоичное дерево исполняющих модулей не будет 'присоединено').

  • Если для каждой информации I и выполняемого сценария S (т. Е. S может выполняться с I в качестве входных данных), я решаю создать новый поток, в результате я могу получить экспоненциальное количество потоков ( Нет?)

Как я могу использовать потоки Python (любой из API) для «безопасной» реализации решения? (псевдо-код?)

Заранее благодарим за вашу мудрость.

1 Ответ

2 голосов
/ 17 июля 2011

Обычный способ решить эту проблему - создать рабочую очередь и сохранить там отдельные задания. Так что вам нужно какое-то программное представление работы, которая должна выполняться одним потоком.

Если у вас есть такая возможность, вы можете использовать пакет многопроцессорной обработки , который предлагает пул «потоков» (см. 16.3.1.5.) И многопоточную очередь для хранения заданий.

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

Обратите внимание, что здесь используется многопроцессорный пакет, потому что, по крайней мере, в CPython с GIL многопоточная Python-программа выгодна только в случае больших операций ввода-вывода или других операций блокировки.

...