У меня есть простая реализация модуля многопроцессорной обработки Python.
if __name__ == '__main__':
jobs = []
while True:
for i in range(40):
# fetch one by one from redis queue
#item = item from redis queue
p = Process(name='worker '+str(i), target=worker, args=(item,))
# if p is not running, start p
if not p.is_alive():
jobs.append(p)
p.start()
for j in jobs:
j.join()
jobs.remove(j)
def worker(url_data):
"""worker function"""
print url_data['link']
Что я ожидаю от этого кода:
- запустите в бесконечном цикле, продолжайте ждать очереди Redis.
- если очередь Redis не пуста, извлечь элемент.
- создать 40 multiprocess.Process, не более не менее
- если процесс завершил обработку, запустите новый процесс, чтобы постоянно выполнялось около 40 процессов.
Я читал, что, чтобы избежать зомби-процесса, который должен быть привязан (присоединен) к родителю, я ожидал этого во втором цикле. Но проблема в том, что при запуске он порождает 40 процессов, воркеры заканчивают обработку и входят в состояние зомби, пока все текущие порожденные процессы не завершатся, а затем в следующей итерации "пока True" тот же шаблон продолжается.
Итак, мой вопрос: как я могу избежать зомби-процессов. и запускать новый процесс, как только завершится 1 из 40