2016-05-10 12 views
0

私はPythonマルチプロセスに慣れていません。私のコードが終了しない理由(おそらく、ゾンビまたはデッドロック)とそれを修正する方法を理解したいと思います。 createChain関数はforループも実行し、タプル:(value1, value2)を返します。 createChainの中には、他の関数を呼び出す関数があります。私はcreateChain機能コードを投稿することは、その機能の中で私がマルチプロセスに関する何かをしていないので助けになるとは思わない。私はデアモンとしてプロセスを作ろうとしましたが、まだ動作しませんでした。奇妙なことに、私がmaxChainsの値を小さくすると、つまり500または100が機能しているということです。Pythonマルチプロセスが終了しない

私はちょうどいくつかの重い作業を行い、その結果をデータ型に入れたいと思っています。 pythonの

私のバージョンは非常に便利な、私はより良い自分のニーズを理解Tadhgマクドナルド・ジェンセンのコメントとどのようにキューが働き、どのような目的のために、彼らが使用する必要がありますに基づいて2.7

def createTable(chainsPerCore, q, chainLength): 

    for chain in xrange(chainsPerCore): 
     q.put(createChain(chainLength, chain)) 


def initTable(): 
    maxChains = 1000 
    chainLength = 10000 
    resultsQueue = JoinableQueue() 
    numOfCores = cpu_count() 
    chainsPerCore = maxChains/numOfCores 

    processes = [Process(target=createTable, args=(chainsPerCore, resultsQueue, chainLength,)) for x in range(numOfCores)] 

    for p in processes: 
     # p.daemon = True 
     p.start() 

    # Wait for hashing cores to finish 
    for p in processes: 
     p.join() 

    resultsQueue.task_done() 

    temp = [resultsQueue.get() for p in processes] 
    print temp 
+0

に私のコードを変更するには、それは本当に長い時間がかかることは可能ですか?それが実行されている間の処理にどれだけの距離の信号を得ることができる方法はありますか? –

+0

それはそれほど時間がかかりません。マルチプロセスなしで実行すると、1分で終了します。また、マルチプロセスを使用しているときにCPUを監視していて、コアが動作していることを確認してから数秒後に作業が終了しますが、プログラムは終了しません。ありがとう! – Laxmana

+0

その場合は、 'p.start()'ループ、 'p.join()'ループ、 'resultsQueue.task_done()'、そして 'temp = ..))、それがどれがフリーズしているかを見てください。 –

答えて

0

です。

私は

def initTable(output): 
    maxChains = 1000 

    results = [] 

    with closing(Pool(processes=8)) as pool: 
     results = pool.map(createChain, xrange(maxChains)) 
     pool.terminate() 
関連する問題