【发布时间】: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中遇到序列化问题,最简单的方法是使用dill(pathos使用)检查对象的序列化。嗯,我已经说过很多次了,也许我应该将相关功能填充到pathos...