2016-02-13 6 views
1

Я пытаюсь выяснить, что происходит в каждом процессе, распечатав имя процесса, идентификатор, что угодно.Как распечатать имя процесса процесса из многопроцессорного пула python

Ниже некоторые тестовый код (код заслуга этого SO question :)

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    print p.map(f, range(6)) 

def main(): 
    b() 

Выхода он производит:

PoolWorker-6 
PoolWorker-10 
PoolWorker-10 
PoolWorker-11 
PoolWorker-14 
PoolWorker-15 
[0, 1, 4, 9, 16, 25] 

Что я и думаю, что я хочу/нужно, чтобы помочь мне отладки что случилось с моей программой. Однако мой код немного отличается (прежний код мне нужно исправить от кого-то другого). Код, который у меня ниже, не печатает хороший идентификатор PoolWorker.

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    for i in range(10): 
     p.apply_async(f(i)) 

def main(): 
    b() 

Когда я запускаю этот код, он печатает:

MainProcess 
MainProcess 
MainProcess 
MainProcess 
MainProcess 
MainProcess 

Так что мой код использует Pool.apply_sync() вместо Pool.map(). Как распечатать уникальный идентификатор/имя для каждого процесса, чтобы я мог понять, что происходит? Заранее спасибо за вашу помощь.

+2

Это потому, что вы вызываете 'f (i)' в родительском процессе, не отправляя его каждому работнику. – univerio

ответ

2

Примечание - Будьте осторожны при открытии слишком много параллельных процессов. apply_sync полезен, но вы должны установить максимальный предел параллельного процесса, который хотите открыть. По умолчанию это None. Также важно отметить, что если любой пул-работник будет свободен, то это будет использоваться. Поэтому поставьте некоторый сон в f (x), чтобы убедиться, что ни один из них не должен быть свободным, пока вы не создадите все параллельные процессы.

import multiprocessing 
import time 
def f(x): 
    print multiprocessing.current_process().name 
    time.sleep(4) 
    return x * x 

def b(): 
    p = multiprocessing.Pool(processes=4) 
    for i in range(4): 
     p.apply_async(f, args=(i,)) 
    p.close() 
    p.join() 
b() 

PoolWorker-1 
PoolWorker-3 
PoolWorker-2 
PoolWorker-4 
1

Попробуйте это:

def f(x): 
    print multiprocessing.current_process().name 
    return x * x 

def b(): 
    p = multiprocessing.Pool() 
    for i in range(10): 
     p.apply_async(f, args=(i,)) 
    p.close() 
    p.join() 


def main(): 
    b() 
Смежные вопросы