Ответ 1
Вы можете использовать возможности блокировки queue
, чтобы вызвать многократный процесс при запуске (используя multiprocessing.Pool
) и позволяя им спать до тех пор, пока некоторые данные не будут доступны в очереди для обработки. Если вы не знакомы с этим, вы можете попробовать "играть" с этой простой программой:
import multiprocessing
import os
import time
the_queue = multiprocessing.Queue()
def worker_main(queue):
print os.getpid(),"working"
while True:
item = queue.get(True)
print os.getpid(), "got", item
time.sleep(1) # simulate a "long" operation
the_pool = multiprocessing.Pool(3, worker_main,(the_queue,))
# don't forget the coma here ^
for i in range(5):
the_queue.put("hello")
the_queue.put("world")
time.sleep(10)
Протестировано с помощью Python 2.7.3 в Linux
Это вызовет 3 процесса (помимо родительского процесса). Каждый дочерний элемент выполняет функцию worker_main
. Это простой цикл, получающий новый элемент из очереди на каждой итерации. Рабочие блокируют, если ничего не готово к процессу.
При запуске все 3 процесса будут спать до тех пор, пока очередь не будет загружена с некоторыми данными. Когда данные доступны, один из ожидающих работников получает этот элемент и начинает его обрабатывать. После этого он пытается получить другой элемент из очереди, ожидая снова, если ничего не доступно...