2017-06-26 8 views
0

私はPythonでマルチプロセッシングを使用してコードをスピードアップしようとしています。マルチプロセッシングを実装しようとしたときに遭遇した唯一の問題は、関数にreturn文があり、そのデータをリストに保存する必要があったことです。私がgoogleを使って見つけた最良の方法は、 "q.put()"としてキューを使用し、 "q.get()"を使用してそれを取得することでした。唯一の問題は、コンパイル後にコマンドプロンプトを使用すると、私のCPUをほとんど使用していないことを示し、Pythonプロセスが1つしか実行されていないことを示しているからです。私が "q.get()"を削除すると、プロセスは超高速で、私のCPUを利用します。私はこれを正しい方法でやっていますか?これはPythonでマルチプロセッシングキューを使用する正しい方法ですか?

import time 
import numpy as np 
import pandas as pd 
import multiprocessing 
from multiprocessing import Process, Queue 


def test(x,y,q): 

    q.put(x * y) 


if __name__ == '__main__': 

    q = Queue() 

    one = [] 
    two = [] 
    three = [] 

    start_time = time.time() 


    for x in np.arange(30, 60, 1): 
     for y in np.arange(0.01, 2, 0.5): 

      p = multiprocessing.Process(target=test, args=(x, y, q)) 
      p.start() 
      one.append(q.get()) 
      two.append(int(x)) 
      three.append(float(y)) 
      print(x, ' | ', y, ' | ', one[-1]) 

    p.join() 

    print("--- %s seconds ---" % (time.time() - start_time)) 

    d = {'x' : one, 'y': two, 'q' : three} 
    data = pd.DataFrame(d) 
    print(data.tail()) 

答えて

1

いいえ、これは正しくありません。プロセスを開始し、結果をすぐにq.getまで待つ。したがって、同時に実行されるプロセスは1つだけです。多くのタスクを操作する場合は、multiprocessing.Pool

import time 
import numpy as np 
from multiprocessing import Pool 
from itertools import product 

def test((x,y)): 
    return x, y, x * y 

def main(): 
    start_time = time.time() 
    pool = Pool() 
    result = pool.map(test, product(np.arange(30, 60, 1), np.arange(0.01, 2, 0.5))) 
    pool.close() 
    print("--- %s seconds ---" % (time.time() - start_time)) 
    print(result) 

if __name__ == '__main__': 
    main() 
+0

これをクリアしていただきありがとうございます。私はなぜ1つのプロセスだけが実行されていたのか理解できず、今なぜ – BillyRay

関連する問題