多处理,有问题
Multiprocessing, having issues
我是一个相当新手的程序员,这是我第一次接触多处理。在 运行 遇到常见的酸洗错误后,我在此处搜索并发现 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)
它默默地失败了,即使有 try/except 圆
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)
告诉我它有什么问题。我在这个文件和其他文件中调用了其他函数,由于该函数是一个它不知道的全新进程,所以我不得不为其他模块添加导入语句并发出 a
from thisModule import thisFunction
用于同一文件中的其他函数。之后我升级了游泳池,它使用以下方法完美运行:
devices = sq.sqlOperation("SELECT * from Devices")
p = Pool(4)
p.map(pullNewData, devices)
谢谢,这对我来说非常有帮助,也是一次学习经历。
新进程不会知道函数所在文件或其他函数中的导入语句,这并没有让我感到不安。那好吧。非常感谢 thebjorn 为我指明了正确的方向。
我是一个相当新手的程序员,这是我第一次接触多处理。在 运行 遇到常见的酸洗错误后,我在此处搜索并发现 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)
它默默地失败了,即使有 try/except 圆
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)
告诉我它有什么问题。我在这个文件和其他文件中调用了其他函数,由于该函数是一个它不知道的全新进程,所以我不得不为其他模块添加导入语句并发出 a
from thisModule import thisFunction
用于同一文件中的其他函数。之后我升级了游泳池,它使用以下方法完美运行:
devices = sq.sqlOperation("SELECT * from Devices")
p = Pool(4)
p.map(pullNewData, devices)
谢谢,这对我来说非常有帮助,也是一次学习经历。
新进程不会知道函数所在文件或其他函数中的导入语句,这并没有让我感到不安。那好吧。非常感谢 thebjorn 为我指明了正确的方向。