2014-11-01 8 views
5

Я использую модуль пула многопроцессорности Python для создания пула процесса и назначения ему заданий.Номер процесса многопроцессорности Python

Я создал 4 процесса и назначения 2 рабочих мест, но при попытке отобразить их номер процесса, но на экране я просто вижу номер один процесс «6952» ... Не должно напечатать номер 2 процесса

from multiprocessing import Pool 
from time import sleep 

def f(x): 
    import os 
    print "process id = " , os.getpid() 
    return x*x 

if __name__ == '__main__': 
    pool = Pool(processes=4)    # start 4 worker processes 

    result = pool.map_async(f, (11,)) #Start job 1 
    result1 = pool.map_async(f, (10,)) #Start job 2 
    print "result = ", result.get(timeout=1) 
    print "result1 = ", result1.get(timeout=1) 

Результат: -

result = process id = 6952 
process id = 6952 
[121] 
result1 = [100] 
+0

Вы используете Windows? – dano

+0

@ dano-yes ....., – user1050619

ответ

2

Это просто до времени. Windows должна порождать 4 процесса в Pool, которые затем нужно запускать, инициализировать и готовить к потреблению с Queue. В Windows это требует, чтобы каждый дочерний процесс повторно импортировал модуль __main__, а для экземпляров Queue, используемых внутри, Pool, чтобы быть незакрашенным в каждом дочернем элементе. Это занимает нетривиальное количество времени. На самом деле, достаточно долго, когда вы оба из ваших вызовов map_async() выполняются до того, как все процессы в Pool будут запущены и запущены. Вы можете увидеть это, если вы добавите прослеживающую функцию запуска каждым работником в Pool:

while maxtasks is None or (maxtasks and completed < maxtasks): 
    try: 
     print("getting {}".format(current_process())) 
     task = get() # This is getting the task from the parent process 
     print("got {}".format(current_process())) 

Выход:

getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
process id = 5145 
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
process id = 5145 
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
result = [121] 
result1 = [100] 
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-3, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-4, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 

Как вы можете видеть, Worker-1 запускается и потребляет обе задачи, стоящие перед работниками 2-4 когда-либо пытались потреблять с Queue. Если добавить sleep вызов после создания экземпляра Pool в основном процессе, но перед вызовом map_async, вы увидите различные процессы обработки каждого запроса:

getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-3, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-4, started daemon)> 
# <sleeping here> 
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
process id = 5183 
got <ForkServerProcess(ForkServerPoolWorker-2, started daemon)> 
process id = 5184 
getting <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
getting <ForkServerProcess(ForkServerPoolWorker-2, started daemon)> 
result = [121] 
result1 = [100] 
got <ForkServerProcess(ForkServerPoolWorker-3, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-4, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-1, started daemon)> 
got <ForkServerProcess(ForkServerPoolWorker-2, started daemon)> 

(Обратите внимание, что дополнительные "getting/"got" заявления вы видите дозорные отправляются каждому процессу, чтобы изящно закрыть их).

Использование Python 3.x в Linux, я могу воспроизвести это поведение, используя контексты 'spawn' и 'forkserver', но не 'fork'. Предположительно, потому что разветвление дочерних процессов происходит намного быстрее, чем их размножение, и делает повторный импорт __main__.

0

Он печатает 2 идентификатора процесса.

result = process id = 6952 <=== process id = 6952 
process id = 6952 <=== process id = 6952 
[121] 
result1 = [100] 

Это связано с тем, что рабочий процесс завершился быстро и был готов обработать другой запрос.

result = pool.map_async(f, (11,)) #Start job 1 
result1 = pool.map_async(f, (10,)) #Start job 2 

В коде выше, ваш работник закончил работу и вернулся обратно в бассейн и был готов завершить работу 2. Это может произойти по нескольким причинам. Наиболее частыми являются то, что рабочий занят или не готов.

Вот пример, где мы собираемся иметь 4 рабочих, но только один из них будет готов сразу же. Таким образом, мы знаем, какой из них будет выполнять эту работу.

# https://gist.github.com/dnozay/b2462798ca89fbbf0bf4 

from multiprocessing import Pool,Queue 
from time import sleep 

def f(x): 
    import os 
    print "process id = " , os.getpid() 
    return x*x 

# Queue that will hold amount of time to sleep 
# for each worker in the initialization 
sleeptimes = Queue() 
for times in [2,3,0,2]: 
    sleeptimes.put(times) 

# each worker will do the following init. 
# before they are handed any task. 
# in our case the 3rd worker won't sleep 
# and get all the work. 
def slowstart(q): 
    import os 
    num = q.get() 
    print "slowstart: process id = {0} (sleep({1}))".format(os.getpid(),num) 
    sleep(num) 

if __name__ == '__main__': 
    pool = Pool(processes=4,initializer=slowstart,initargs=(sleeptimes,)) # start 4 worker processes 
    result = pool.map_async(f, (11,)) #Start job 1 
    result1 = pool.map_async(f, (10,)) #Start job 2 
    print "result = ", result.get(timeout=3) 
    print "result1 = ", result1.get(timeout=3) 

пример:

$ python main.py 
slowstart: process id = 97687 (sleep(2)) 
slowstart: process id = 97688 (sleep(3)) 
slowstart: process id = 97689 (sleep(0)) 
slowstart: process id = 97690 (sleep(2)) 
process id = 97689 
process id = 97689 
result = [121] 
result1 = [100] 
+0

gist at https://gist.github.com/dnozay/b2462798ca89fbbf0bf4 – dnozay

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