多处理,有问题

时间:2016-07-29 09:16:24

标签: python pathos

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

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

1 个答案:

答案 0 :(得分:1)

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

from thisModule import thisFunction

用于同一文件中的其他功能。之后我把游泳池加了起来,并且完美地使用了:

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

谢谢,这对我来说非常有帮助并且非常有学习经验。

我没有告诉我新进程不会知道函数所在文件中的import语句,或其他函数。那好吧。非常感谢thebjorn指出我正确的方向。