1

我是一个相当新手的程序员,我第一次接触到多处理。在遇到常见的酸洗错误后,我在这里搜索并发现 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 ]

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

4

1 回答 1

1

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

from thisModule import thisFunction

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

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

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

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

于 2016-07-29T12:04:31.183 回答