2016-07-28 2 views
0

Это мой код:Python многопроцессорной apply_async только с помощью одного процесса

import multiprocessing 
import time 
import os 

def worker(): 
    print str(os.getpid()) + " is going to sleep..." 
    time.sleep(1) 
    print str(os.getpid()) + " woke up!" 
    return 

if __name__ == "__main__": 
    pool = multiprocessing.Pool(processes = 8) 
    for _ in range(5): 
     pool.apply_async(worker()) 

И мой выход:

23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 
23173 is going to sleep... 
23173 woke up! 

Этот выход появляется последовательно и, очевидно, все выходы имеют один и тот же идентификатор. То, что я ожидаю увидеть, - это 5 отдельных процессов, предупреждающих о том, что они будут спать, а затем пробуждаются в подобные моменты.

Почему этого не происходит? Я провел много исследований в stackoverflow и других сайтах, и кажется, что все уверены, что это должно иметь «рабочий» вызываемый, примененный к нескольким процессам, но, похоже, это не так.

+0

должен быть: 'apply_asynch (worker)' без '()'. – Bakuriu

ответ

2

Вы вызова функция worker, поэтому текущий процесс выполняет этот код и затем результат worker (т.е. None) передается в apply_asynch, который ничего не делает.

Изменить его pool.apply_asynch(worker) таким образом функциюworker передаются подпроцесс, который выполняет его.


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

>>> def worker(): 
...  print('Hi there!') 
... 
>>> def f(func): 
...  print('Received', func) 
...  func() 
... 
>>> f(worker()) 
Hi there! 
Received None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in f 
TypeError: 'NoneType' object is not callable 

И это:

>>> f(worker) 
Received <function worker at 0x7f5cd546f048> 
Hi there! 

Обратите внимание, что первый имеет неправильный порядок строк и производит TypeError. К сожалению, отключает исключения по умолчанию. Однако вы можете обрабатывать ошибки, проходящие в дополнительных аргументах.

Смежные вопросы