2016-12-03 13 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の4つのコアを使用していますか私はミスをしたのですか?
  2. なぜマルチプロセスのないランタイムが非常に高速ですか?間違いはありますか?
  3. マルチプロセッシングを使用しているときにprintコマンドが機能しないのはなぜですか?

答えて

4

一度に4つのプロセスをプロセスプールに送信します。マルチプロセスの例では、funcが10回実行されていますが、プレーンコールは1回だけ実行されています。さらに、プロセスの起動には、実行時のオーバーヘッドがあります。これらはおそらくランタイムの違いを説明します。

もっと簡単な例は参考になると思います。 funcは5秒間スリープしてから、入力と共に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)

これは、最初の4つのために厳密ではないが同時に出力され、その

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

注意を出力します。 5番目(n == 4)の出力は5秒後に出力されます。これは、4つのプロセスからなるプールがあり、最初の4つのプロセスが完了した後にしか開始できないためです。

関連する問題