2016-12-03 41 views
1

我最近開始學習python中的多處理。對此我有一些問題。下面的代碼顯示我的例子:關於多處理的幾個問題。池

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. 此代碼是否使用CPU的四個核還是我犯了一個錯誤?
  2. 爲什麼沒有多處理的運行時間如此之快?有錯誤嗎?
  3. 爲什麼print命令在使用多處理時不起作用?

回答

4

它一次向進程池提交四個進程。您的多處理示例運行func十次,而普通呼叫僅運行一次。另外,啓動進程有一些運行時間開銷。這些可能解釋了運行時間的差異。

我認爲一個更簡單的例子是有啓發性的。 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)在五秒鐘之後得到輸出,這很有意義,因爲我們有四個進程池,並且只有在前四個進程完成後才能開始。