многопроцессорность создает процесс zomb ie даже после .join () - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть фрагмент кода, который я распараллеливаю следующим образом: -

def stats_wrapper(a,b,c,d):
    q = mp.Queue()
    # b here is a dictionary
    processes = [mp.Process(target = stats,args = (a,{b1:b[b1]},c,d,q) ) for b1 in b]
    for p in processes:
        p.start()
    results = []
    for p in processes:
        results.append(q.get())
    return(results)

Я вижу много процессов zomb ie после выполнения этого блока. Я пытаюсь использовать метод .join() перед строкой return(result) следующим образом: -

for p in processes:
   p.join()

, но это не помогает избавиться от процессов zomb ie. Может ли кто-нибудь помочь мне точно определить, где я ошибаюсь с моим кодом?

Редактировать: - Я использую в другом месте моего кода другой подход к распараллеливанию, который снова дает мне несколько процессов зомба ie, кроме Я не знаю, как изменить код, чтобы добавить соединение.

q = mp.Queue()
jobs = (func1,func2,func3)
args = ((arg1,arg2,arg3),(arg2,arg3),(arg1,arg4))
for job,arg in zip(jobs,args):
   mp.Process(target = job,args = arg,name = str(job.__name__)).start()
result = []
for _ in range(len(job)): 
   result.append(q.get())

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Если вы хотите попробовать более высокий уровень multiprocessing.Pool(),

def stats_wrapper(a, b, c, d):
    with multiprocessing.Pool() as p:
        args = [(a, {b1: b[b1]}, c, d) for b1 in b]
        return list(p.starmap(stats, args))

должен быть эквивалентным (кроме q, не передаваемого на stats; эта функция может просто вернуть результат).

Если вам не нужны результаты в порядке, используйте p.imap_unordered(), который может использовать пул процессов более эффективно.

0 голосов
/ 19 февраля 2020

Вы можете попробовать этот код для получения результатов из очереди:

def stats_wrapper(a,b,c,d):
    q = mp.Queue()
    # b here is a dictionary
    processes = [mp.Process(target = stats,args = (a,{b1:b[b1]},c,d,q)) for b1 in b]
    for p in processes:
        p.start()
    results = []
    for p in processes:
        p.join()
    while not q.empty():
        results.append(q.get())
    return(results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...