Я сделал то же самое для обработки веб-статистики с помощью семафора. По сути, по мере создания процессов семафор увеличивается. Когда они выходят, это уменьшается. Процесс создания блокируется, когда семафор блокируется.
Это фактически запускает потоки, которые немного запускают внешние процессы по пути выполнения.
Вот пример.
thread_sem = threading.Semaphore(int(cfg.maxthreads))
for k,v in log_data.items():
thread_list.append(ProcessorThread(int(k), v, thread_sem))
thread_list[-1].start()
И затем в конструкторе для ProcessorThread я делаю это:
def __init__(self, siteid, data, lock_object):
threading.Thread.__init__(self)
self.setDaemon(False)
self.lock_object = lock_object
self.data = data
self.siteid = siteid
self.lock_object.acquire()
Когда поток завершает свою задачу (успешно или нет), lock_object
освобождается, что позволяет начать другой процесс.
НТН