2014-10-31 4 views
0

Я пытаюсь понять модуль многопроцессорности Python. В приведенном ниже коде создается 4 процесса и выполняется запуск функции f(x).Pulton multiprocessing получить результаты

Вопросы

  1. Я создаю 4 процесса, но повинуясь несколько задач (е, [10]). Будет ли модуль автоматически запускаться каждые 4 процесса в любое время?
  2. Я фиксирую результат в списке. Что вернет pool.apply_async, будут ли они распечатывать заявления в задании или что-то, возвращаемое методом?

При выполнении этого кода он отображает только 100, но не другие значения.

from multiprocessing import Pool 

def f(x): 

    print x*x 
    return x*x 


if __name__ == '__main__': 

    result = [] 
    pool = Pool(processes=4)    
    result.append(pool.apply_async(f, [10])) 
    out = map(lambda x: x.get(), result) 
+0

Все ваши вопросы отвечают в документах: https://docs.python.org/2/library/multiprocessing.html – Wolph

ответ

1

Созданный вами пул имеет 4 доступных ему процесса. Затем вы даете ему одну работу, и она обрабатывает ее одному из своих 4-х рабочих. Если вы дадите ему больше рабочих мест, это будет использовать больше работников.

+0

Итак, в моем случае .. Я дал 10 рабочих мест ... это означает, что это будет создавать 10 процессов одновременно или будет запускать 4 процесса и снова создать еще 4 процесса. – user1050619

+0

Вы определяете количество рабочих, доступных для пула в вашем конструкторе. Пул имеет внутреннюю очередь, и когда вы даете ему задания через apply_async, он помещает эти задания в очередь. Затем рабочий обрабатывает задания из очереди (асинхронно). Поэтому, если вы дадите ему 10 заданий, тогда все 4 работника должны быть заняты до тех пор, пока рабочая очередь не будет опустошена ... –

1

Вы на самом деле представляете только одну задачу здесь: Функция f с аргументом tuple (10,), то есть вы просто выполняете f(10) у одного работника. Если вы фактически отправили более 4 процессов, то Pool всегда выполнял не более 4 задач одновременно. Как только одна задача будет завершена, будет запущена ожидающая задача, чтобы ее заменить, пока не останется никаких оставшихся задач. Также обратите внимание, что все четыре процесса будут использоваться все время; они не перезапускаются после завершения задачи, если вы не предоставите аргумент ключевого слова при создании Pool.

apply_async вернет объект AsyncResult, который может быть использован для извлечения результата задачи, как только он будет доступен. Вы делаете это, вызывая get() на объекте AsyncResult, поэтому список out будет содержать возвращаемое значение вашего одного вызова до f. Материал, который вы print в рабочем процессе, появится в stdout, как если бы вы запустили его в основном процессе, но он нигде не попадает.