gpt4 book ai didi

python - multiprocessing.Pool 似乎可以在 Windows 中使用,但不能在 ubuntu 中使用?

转载 作者:太空狗 更新时间:2023-10-30 02:49:44 27 4
gpt4 key购买 nike

已解决:问题出在 Wingware Python IDE。我想现在自然的问题是这怎么可能以及如何解决。

我昨天问了一个问题(Problem with multiprocessing.Pool in Python),这个问题几乎是一样的,但我发现它似乎可以在 Windows 计算机上运行,​​而不是在我的 ubuntu 上运行。在这篇文章的结尾,我将发布一个略有不同的代码版本来完成同样的事情。

我的问题的简短摘要:在 Python 中使用 multiprocessing.Pool 时,我并不总是能够获得我要求的工作人员数量。发生这种情况时,程序就会停止。

我整天都在寻找解决方案,然后我开始思考诺亚斯对我上一个问题的评论。他说它可以在他的机器上运行,所以我把代码给了我的同事,他运行的是带有 Enthoughts 64 位 Python 2.7.1 发行版的 Windows 机器。我和我在 ubuntu 上运行的巨大差异相同。我还提到我们都有 Wingware Python IDE,但我怀疑这是否重要?

我的代码有两个问题,当我的同事在他的机器上运行代码时不会出现这些问题。

  1. 我并不总是能够得到我要求的四个 worker (尽管我的机器有 12 个 worker )。发生这种情况时,该过程只会停止而不会继续。没有出现异常或错误。

  2. 当我能够得到我要求的四名 worker 时(这种情况大约发生 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 机器上重复运行您的代码而不会失败。 编辑:原来问题是由您的 IDE (Wingware) 引起的。显而易见的解决方法是从 IDE 外部运行脚本。

关于第二个问题,发生的情况是在 Unix 上每个工作进程都从父进程继承随机数生成器的相同状态。这就是它们生成相同伪随机序列的原因。要解决此问题,您只需在 testfunc 顶部调用 scipy.random.seed:

def testfunc(x0, N):
sp.random.seed()
print 'working with x0 = %s' % x0
...

关于python - multiprocessing.Pool 似乎可以在 Windows 中使用,但不能在 ubuntu 中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com