2017-07-10 14 views
0

私はPython 3でマルチプロセッシングを試していますが、私はいくつかの奇妙な動作に遭遇しました(少なくとも、私にとっては奇妙です)。タプルを使用したPythonマルチプロセッシングが動作しません

本質的には、10個の乱数のリストを作成します。私は範囲をループします(私の例では2です)。各反復で、私はpool.apply_asyncを使って乱数を並列に処理します。 「処理」の結果はリストに格納され、すべての処理が完了したら結果を印刷することができます。私は2 * 10の結果を期待しています。私はからtups=[]tups.append("GO", datasetlink)return tupsを削除すると

import multiprocessing 
import time 
import random 

class Calculator: 

    def calculate(self, links): 
     print("LENGHT:", len(links)) # 48 
     tups=[] 
     for datasetlink in links: 
      print(datasetlink) 
      tups.append("GO", datasetlink) 
     return tups 

dslinks = random.sample(range(1, 101), 10) 
result_list = [] 

def Process(datasetlinks): 

    calc = Calculator(); 
    tups = calc.calculate(datasetlinks) 
    return tups; 

def log_result(result): 
    result_list.append(result) 

def apply_async_with_callback(): 
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) 
    for i in range(2): 
     pool.apply_async(Process, args = (dslinks,), callback = log_result) 
    pool.close() 
    pool.join() 
    DoPrintResults() 

def DoPrintResults(): 
    for result in result_list: 
     print(result) 

if __name__ == '__main__': 
    start = time.time() 
    apply_async_with_callback() 
    end = time.time() 
    print("Execution took: ", (end-start), " seconds") 

:私は見つける何

は、しかし、何らかの理由で、私はちょうど2の結果(私の最初のループでは、すなわち2回の繰り返し)を参照してくださいということですCalculator.calculate機能はすべて正常に動作し、for-loopCalculator.calculateで20回ヒットしたことがわかります。

私は間違っていますか?

tups.append(datasetlink) 

マルチコードをデバッグすることは難しいことができます:にあること

tups.append("GO", datasetlink) 

変更:

+0

はどこにtupsを作るんですタプル。現在のところalistであるようです –

+0

'tups.append(" GO "、datasetlink)'で 'TypeError'を取得していませんか? 'append'は引数を1つだけとります。 – Will

+0

@ Professor_Joykill OMG。ありがとうございました。 wilusdamanが尋ねたように私に何の誤りも与えていないので、私はそれを完全に見落としました。 – pookie

答えて

0

問題は、このラインです。デバッグの1つの方法は例外を使用することです。私に<type 'exceptions.NameError'>を与えた

def Process(datasetlinks): 
    try: 
     calc = Calculator(); 
     tups = calc.calculate(datasetlinks) 
    except: 
     print(sys.exc_info()[0]) 
    return tups; 

を、私はtryブロックを移動したときに計算する:tryブロックにProcessにすべてをかける

def calculate(self, links): 
    try: 
     print("LENGHT:", len(links)) # 48                  
     tups=[] 
     for datasetlink in links: 
      print(datasetlink) 
      tups.append("GO", datasetlink) 
    except: 
     print(sys.exc_info()[0]) 
    return tups 

を私が代わりに<type 'exceptions.TypeError'>

+0

ありがとうございます。これは@Professor_Joykillが指摘していたものなので、問題を解決することができました。 try/catchも良いアイデアです。私は何の誤りもなかったので、それは私を投げていた。 – pookie

関連する問題