недавно у меня возникла проблема с зомби-процессами при использовании многопроцессорности в Python.
У меня есть скрипт, который создает несколько процессов (рабочих), а также другой процесс (принтер). Рабочие будут создавать сообщения в очереди, а принтер должен распечатать все сообщения в очереди.
Проблема в том, что обычно рабочие должны работать часами. Но иногда после запуска скрипта хочется изменить код и перезапустить скрипт. Если я подожду, пока задание завершится, зомби не будет, так как я использую join(). Но если я отключу ядро напрямую (поскольку ctrl+C не работает для моего спайдера), все процессы (зомби) все равно будут работать.
Я пытался использовать os.ppid
, но кажется, что ppid не меняется. Я пробовал p.daemon = True
, но тоже не работает.
Поэтому я хотел бы спросить, есть ли способ убедиться, что, если я выключу ядро, все процессы завершатся сами, и в системе не будет зомби.
Спасибо, пример кода:
from multiprocessing import Process, Queue
import time
def f(num, q):
for i in range(100):
q.put('f: num=%d\n'% (num,))
time.sleep(10)
def g(q, filename):
while True:
with open(filename, 'a') as f:
if q.qsize() > 0:
item = q.get()
if item == None:
break
else:
f.write(item)
def main():
filename = './log.txt'
q = Queue()
workers = [Process(target=f, args=(i,q)) for i in range(10)]
printer = Process(target=g, args=(q,filename))
for p in workers:
p.daemon = True
p.start()
printer.daemon = True
printer.start()
for p in workers:
p.join()
q.put(None)
printer.join()
if __name__ == '__main__':
main()