2011-08-01 6 views
1

私はPythonの並列処理に少し問題があります。私は、パラレルコンピューティングのコンセプトに全く新しいものです。標準のPythonに付属するマルチプロセッシングを使用します。Pythonのマルチプロセッシングに問題があります

私のコンピュータには12のスレッドがあります。私は12人の労働者を求めているが、私が求めているすべての労働者を常に得ることはできない。私の問題は、下記の私のコードでタスクの数nTasksを処理するのに必要な数のワーカーにアクセスできない場合に発生します(現在は4に設定されています)。次に起こるのは、コードがスタックして、「#Get Results」というコメントの下に決して到達しないということだけです。私が(私は常に12を求める)取得する方法多くの労働者のランダムなようだが、私は次のコードで作業員3名以下を取得するときに問題が発生する:私はプールの代わりにpool.map_async使用しようとしました

import multiprocessing as mp 
import scipy as sp 
import scipy.stats as spstat 
import pylab 

def testfunc(x0, N): 
    print 'working with x0 = %s' % x0 
    x = [x0] 
    for i in xrange(1,N): 
     x.append(spstat.norm.rvs(size = 1)) # stupid appending to make it slower 
     if i % 10000 == 0: 
      print 'x0 = %s, i = %s' % (x0, i) 
    return sp.array(x) 

def testfuncParallel(fargs): 
    return testfunc(*fargs) 

pool = mp.Pool(12) # I have 12 threads 

nTasks = 4 
N = 100000 

tasks = [(x, n) for x, n in enumerate(nTasks*[N])] # nTasks different tasks 

result = pool.map(testfuncParallel, tasks) 
pool.close() 
pool.join() 

# Get results: 
sim = sp.zeros((N, nTasks)) 

for nn, res in enumerate(result):  
    sim[:, nn] = res 

pylab.figure() 
for i in xrange(nTasks): 
    pylab.subplot(nTasks,1, i + 1) 
    pylab.plot(sim[:, i]) 

pylab.show() 

私は問題を回避することはできません。事前に

おかげで、敬具

マティアス

+0

これは私のためにうまくいくようです - どのバージョンのマルチプロセッシング、scipy、pylabを使用していますか? – Noah

+0

12のプロセスを要求していますが、4つのタスクしか提出していないのはなぜですか? – Noah

+1

[pool.close()とpool.join()はmap_async()バージョンでのみ必要です] – Noah

答えて

0

は、それは私の他の質問にステファンDeibelsのコメントを参照して、ウィングエディタでデバッグモードを実行している場合、これが唯一の問題だったことが判明しましたmultiprocessing.Pool seems to work in Windows but not in ubuntu?

+0

これはPythonでは珍しくありません....私は過去にIDLEで問題を抱えていました。あなたは彼らがpythonの権利でパッケージ化したIDEを手に入れると思います。 – Richard