2016-07-29 53 views
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) 

其中默默地失败,即使有一个try /只是绕着它

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

你有没有试过'Pool(1)'?(来检查你是如何使用pathos的问题,或者如果它是代码中的同步问题) – thebjorn

+0

好吧,经过一些似乎现在一齐解雇他们的小事,但我遇到了另一个问题paramiko连接似乎不起作用。嗯... –

+0

总之,谢谢,那就是了。解决了我的代码的一些问题后,我们开始了! –

回答

1

所以试图Pool(1)告诉我它有什么问题。我打电话都这个文件和其他文件,其内的其他功能,由于功能是一个全新的过程,它没有有关的想法,所以我不得不把两个其他模块导入语句,并出具

from thisModule import thisFunction 

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

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

谢谢,这是非常有益的,非常有学习经验对我来说。

它并未向我表明新进程不会意识到函数所在文件中的import语句或其他函数。好吧。非常感谢thebjorn为我指出了正确的方向。