2016-12-03 3 views
1

Я начал недавно изучать многопроцессорность в python. В связи с этим у меня есть некоторые вопросы. Следующий код показывает мой пример:Несколько вопросов о multiprocessing.Pool

import multiprocessing 
from time import * 

def func(n): 
    for i in range(100): 
     print(i, "/ 100") 
     for j in range(100000): 
      a=j*i 
      b=j*i/2 

if __name__ == '__main__': 
    #Test with multiprosessing 
    pool = multiprocessing.Pool(processes=4) 
    t1 = clock() 
    pool.map(func, range(10)) 
    pool.close() 
    t2 = clock() 
    print(t2-t1) 
    #Test without multiprocessing 
    func(range(10)) 
    t3 = clock() 
    print(t3-t2) 
  1. ли этот код использовать четыре ядра процессора или я сделал ошибку?
  2. Почему рабочая среда без многопроцессорной обработки намного быстрее? Есть ли ошибка?
  3. Почему команда print не работает при многопроцессорной обработке?

ответ

4

Он представляет собой четыре процесса за раз в ваш пул процессов. Пример вашего многопроцессорности выполняется 1func десять раз, тогда как обычный вызов выполняется только один раз. Кроме того, стартовые процессы имеют некоторые накладные расходы времени выполнения. Вероятно, это объясняет разницу во времени выполнения.

Я думаю, что более простой пример - поучительный. func теперь спит в течение пяти секунд, затем распечатывает свой вход n, а также время.

import multiprocessing 
import time 

def func(n): 
    time.sleep(5) 
    print([n, time.time()]) 

if __name__ == '__main__': 
    #Test with multiprosessing 
    print("With multiprocessing") 
    pool = multiprocessing.Pool(processes=4) 
    pool.map(func, range(5)) 
    pool.close() 

    #Test without multiprocessing 
    print("Without multiprocessing") 
    func(1) 

pool.map(func, range(5)) работает func(0), func(1), ..., func(4).

Это выводит

With multiprocessing 
[2, 1480778015.3355303] 
[3, 1480778015.3355303] 
[1, 1480778015.3355303] 
[0, 1480778015.3355303] 
[4, 1480778020.3495753] 
Without multiprocessing 
[1, 1480778025.3653867] 

Следует отметить, что первые четыре вывода, в то же время, а не строго в порядке. Пятый (n == 4) получает выход пять секунд спустя, что имеет смысл, поскольку у нас есть пул из четырех процессов, и он может начаться только после того, как были сделаны первые четыре.

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