当前位置: 首页 > 面试题库 >

multiprocessing.Pool似乎可以在Windows中工作,但不能在ubuntu中工作?

越国源
2023-03-14
问题内容

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

昨天我问了一个问题Python中的multiprocessing.Pool问题,这个问题几乎相同,但是我发现它似乎可以在Windows计算机上运行,​​而不能在我的Ubuntu上运行。在本文的结尾,我将发布执行相同功能的代码的稍有不同的版本。

我的问题的简短摘要:在Python中使用multiprocessing.Pool时,我不能总是获得所需的工作量。发生这种情况时,程序将停止。

我整天都在努力寻找解决方案,然后我开始思考诺亚斯对我之前的问题的评论。他说它可以在他的机器上工作,所以我将代码提供给了我的同事,后者使用Enthoughts
64位Python 2.7.1发行版运行Windows机器。我和我在ubuntu上运行的最大区别相同。我还提到我们都有Wingware Python
IDE,但是我怀疑这是否重要?

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

  1. 我并不能总是得到我要的四个工人(尽管我的机器有12个工人)。发生这种情况时,该过程将停止并且不会继续。没有异常或错误引发。

  2. 当我能够找到我要的四个工人时(大约发生5次1次),所产生的数字(纯随机数)对于所有四张图片来说都完全相同。我的同事不是这种情况。

事情非常糟糕,我非常感谢你们提供的任何帮助。

编码:

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()

提前致谢。

此致Matias


问题答案:

更新: 事实证明,这与matplotlib或后端无关,而是与与多处理相关的错误有关。我们已经为Wing
4.0.4+版本修复了此问题。解决方法是不要在子流程中执行的代码中设置断点。

这似乎是Wing IDE对Tkinter后端与多处理程序交互不良的matplotlib支持。当我尝试此示例时,它在TCL /
Tk代码中崩溃。我怀疑在Windows上工作的人正在使用其他matplotlib后端。

在“扩展”选项卡下的“项目属性”中关闭“ matplotlib事件循环支持”似乎可以解决此问题。

或者,打开“ matplotlib事件循环支持”后,添加以下内容似乎可以为我解决此问题。

导入matplotlib matplotlib.use(’WXAgg’)

仅在具有WXAgg后端的情况下才有效。Wing
IDE支持的其他后端(即使调试过程暂停也可以使绘图保持交互式)是GTKAgg和Qt4Agg,但我还没有尝试过。

我将查看是否可以找到并修复该错误。我怀疑当进程ID更改时,我们需要禁用事件循环支持。感谢您举报。



 类似资料:
  • 几天来,我一直在用头撞这个,完全被难倒了。下面是纲要: 我有一个Eclipse插件项目,使用Tycho通过Maven 3构建 在Maven中,我已经设置了maven-jarsigner-plugin来使用我的keystore对jars进行签名(有关keystore的详细信息,请参阅下文) 我的密钥库里有个Thawte签名的代码签名证书 我可以从目标/*中获取任何签名的jar文件,并在上面运行“ja

  • 我试图制作一个跨平台的JavaFX应用程序,它在Windows和OSX机器上工作得很好,但在Linux上不行。 jar是在Intellij思想中使用基本的JavaFX配置构建的。 有人帮忙吗?

  • 我有一段非常简单的Java代码,在那里我尝试从Java连接到我的Oracle DB。 在Windows下一切正常,但当我尝试在Ubuntu上运行时,我得到了一个错误。 我读了很多书,也试过很多解决方法。这是我的代码: 当我运行它时,我收到一个错误: 连接失败Java.sql.sqlRecoverable异常:IO错误:网络适配器无法在oracle.jdbc.driver.T4CConnection

  • 我能够登录我的本地(和远程服务器)与以下curl(我用Postman生成)...我可以登录成功使用另一个API客户端(Rest)与我试图在Postman中使用相同的参数/头/体。我已经关闭了SSL证书验证和发送邮递员令牌头设置(每其他堆栈溢出答案)... 卷曲: Curl-X POST\http://localhost:8080/api/user/login\-H'接受:应用程序/json'\-H

  • 我试图做一个文件上传到一个链接(共享点Rest服务),在chrome浏览器中工作良好,但不是在android WebView。 我知道android webview有很多限制,但我尝试使用以下方法上传一个文件 https://github.com/mgks/os-fileup 它打开浏览器,但它不显示文件名,也不上传任何内容或调用服务,但同样的代码在chrome浏览器中运行良好(请注意,我已经启用

  • 我刚刚安装了node.js,我还在环境变量中设置了PATH。PATH值为: