已解決:問題是Wingware Python IDE。我想現在自然的問題是如何可能以及如何解決這個問題。multiprocessing.Pool似乎在Windows中工作,但不在Ubuntu?
昨天我問了一個問題(Problem with multiprocessing.Pool in Python),這個問題幾乎一樣,但我發現它似乎在Windows計算機上工作,而不是在我的Ubuntu上。在這篇文章的最後,我會發佈一個稍微不同的代碼版本,做同樣的事情。
我的問題的簡短摘要:在Python中使用multiprocessing.Pool時,我並不總是能夠獲得我要求的工作量。發生這種情況時,程序就會停止。
我一直在爲解決方案整天工作,然後我開始考慮諾亞斯對我以前的問題的評論。他說,它在他的機器上工作,所以我將代碼交給了我的同事,他使用Enthoughts 64位Python 2.7.1發行版運行Windows機器。我和我在ubuntu上運行的巨大差異一樣。我還提到我們都有Wingware Python IDE,但我懷疑這是否重要?
當我的同事在他的機器上運行代碼時,我的代碼有兩個問題不會出現。
我並不總是能夠得到我要求的四名工人(雖然我的機器有12名工人)。當發生這種情況時,這個過程就會停止並且不會繼續。沒有異常或錯誤發生。
當我能夠得到我要求的四名工人(發生約1次5次左右)時,生成的數字(普通的隨機數)對於所有四張照片都是完全相同的。我的同事並非如此。
東西很腥,我非常感謝你們提供的任何幫助。
代碼:
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)
# Define Number of tasks.
nTasks = 4
N = 100000
if __name__ == '__main__':
"""
Try number 1. Using multiprocessing.Pool together with Pool.map_async
"""
pool = mp.Pool(processes = nTasks) # I have 12 threads (six cores) available so I am suprised that it does not get access to nTasks = 4 amount of workers
# Define tasks:
tasks = [(x, n) for x, n in enumerate(nTasks*[N])] # nTasks different tasks
# Compute parallel: async - asynchronically, i.e. not necessary in order.
result = pool.map_async(testfuncParallel, tasks)
pool.close() # These are needed if map_async is used
pool.join()
# Get results:
sim = sp.zeros((N, nTasks))
for nn, res in enumerate(result.get()):
sim[:, nn] = res
pylab.figure()
for i in xrange(nTasks):
pylab.subplot(nTasks,1, i + 1)
pylab.plot(sim[:, i])
pylab.show()
在此先感謝。
真誠, 馬蒂亞斯
這似乎在Enthought的Python 2.7.1 [EPD 7.0-2(64位)]我的64位Ubuntu盒子上工作。我已經多次運行你的代碼,似乎無法讓它停止。 – NPE
謝謝。我真的不知道什麼區別我的機器和其餘部分:( – matiasq
所以這與隨機數字生成沒有關係?我很困惑,從網上閱讀看來,期望的行爲是每個進程應該表現出完全相同的方式,所以一個人必須重置隨機種子? –