【问题标题】:Multiprocessing, having issues多处理,有问题
【发布时间】:2016-12-03 22:41:43
【问题描述】:

我是一个相当新手的程序员,我第一次接触到多处理。在遇到常见的酸洗错误后,我在这里搜索并发现 Pathos 可能是最好用的东西。

完整的应用程序的要点是它使用 ssh 连接到一组服务器,将数据拉出并将其存储到数据库中。它工作得很好,但如果它运行多处理显然会有好处。

原来的函数调用是这样的:

    devices = sq.sqlOperation("SELECT * from Devices")
    for device in devices:
            pullNewData(device) 

简而言之,SQL 查询为我提供了一个字典列表,我为每个记录提供 pullNewData() 一个字典,它会执行、连接、拉取所有内容并更新数据库。

我宁愿不重写几千行代码,所以我希望适应它会很容易: 以下所有示例都有:

from pathos.multiprocessing import ProcessingPool as Pool

在顶部。我试过了:

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    p.apipe(pullNewData, devices) 

即使尝试/除外,它也默默地失败了

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    p.map(pullNewData, devices) 

同样的,静默失败:

但是:

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    for data in devices:
        p.apipe(pullNewData(data))

工作,但只是依次完成每一个。

在我绝望的情况下,我什至尝试将它放在列表理解中(是的,它非常丑陋,但那时我会做任何事情)

    devices = sq.sqlOperation("SELECT * from Devices")
    p = Pool(4)
    [ p.apipe(pullNewData(data)) for data in devices ]

那么,我该怎么做呢? 我如何让它以并行方式为每条记录启动一个新连接?

【问题讨论】:

  • 你试过Pool(1)吗? (检查是否是您使用 pathos 的问题,或者是否是您的代码中的同步问题)
  • 好的,经过一些摆弄之后,现在似乎齐心协力地解雇了他们,但我遇到了另一个问题,paramiko 连接似乎不起作用。嗯...
  • 简而言之,谢谢,它做到了。在解决了我的代码的一些问题后,我们开始了!
  • 题为题;答案是为了答案。回答你自己的问题是完全可以的;事实上,它是鼓励的。如果您有解决方案,请不要犹豫添加答案,但问题不适合它。
  • 如果您在pathos 中遇到序列化问题,最简单的方法是使用dillpathos 使用)检查对象的序列化。嗯,我已经说过很多次了,也许我应该将相关功能填充到pathos...

标签: python pathos


【解决方案1】:

所以尝试Pool(1) 向我展示了它遇到的问题。我在这个文件和其他文件中调用了其他函数,由于该函数是一个它不知道的全新进程,所以我不得不为其他模块添加导入语句并发出一个

from thisModule import thisFunction

用于同一文件中的其他功能。然后,我增加了游泳池,它完美地使用了:

devices = sq.sqlOperation("SELECT * from Devices")
p = Pool(4)
p.map(pullNewData, devices)

谢谢,这对我来说非常有帮助,也是一次学习经历。

我没有想到新进程不会知道函数所在文件或其他函数中的导入语句。那好吧。非常感谢 thebjorn 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2015-05-26
    • 2016-08-28
    • 2022-06-17
    • 1970-01-01
    相关资源
    最近更新 更多