2013-12-10 63 views
2

我在totalprocessing totaly。我试图改变我的代码,以便同时运行它的一部分。Python和多处理示例

我有一个巨大的列表,我必须调用每个节点的API。因为API是独立的,所以我不需要第一个API的结果就可以继续进行第二个。所以,我有这样的代码:

def xmlpart1(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part1 

def xmlpart2(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part2 

def main(index): 
    mylist = [[..,..],[..,..],[..,..],[..,...]] # A huge list of lists with ids I need for calling the APIs 
    myL= mylist[index] c 
    mydic = {} 
    for i in myL: 
     flag1 = xmlpart1(i) 
     flag2 = xmlpart2(i) 
     mydic[flag1] = flag2 

    root = "myfilename %s.json" %(str(index)) 

    with open(root, "wb") as f: 
     json.dump(mydic,f) 

from multiprocessing import Pool 

if __name__=='__main__': 
    Pool().map(main, [0,1,2,3]) 

从这里,并从聊天的几个建议后,我结束了这段代码。问题仍然存在。我在9:50运行脚本。 10:25第一个文件“myfilename 0.json”出现在我的文件夹中。现在是11:25,其他文件都没有出现。子列表具有相同的长度,并且它们执行相同的操作,所以它们大约需要相同的时间。

+0

我很困惑,你问什么帮助,在这里。因为名称代码[1-4]被重用(函数没有主要方法),所以发布的代码将不起作用,并且输出数据处理的问题在您根本没有显示的代码中。 –

+0

现在比较好。主要功能来自导入的功能。如果我在一个脚本中运行代码,我没有问题。所以问题不在于main()函数,而在于如何使用多处理库 – Tasos

+0

这不是保存数据的多处理库。失败的部分不在您展示的部分中。 –

回答

1

这是更适合multiprocessing.Pool()类的东西。

这里有一个简单的例子:

from multiprocessing import Pool 

def job(args): 
    """Your job function""" 


Pool().map(job, inputs) 

其中:

  • inputs是你的输入列表。每个输入都被传递给作业并在一个单独的进程中处理。

当所有作业都完成后,您将结果返回列表。

multiprocessing.Pool().map就像Python builtin map()一样,但为您设置一个工作进程池并将每个输入传递给给定的函数。

查看文档的更多细节:http://docs.python.org/2/library/multiprocessing.html

+0

如果我会这样做,输出文件将被覆盖。为了使输出json文件有4个不同的名称,我使用了4个不同的函数。 – Tasos

+0

你让你的''job()''函数输出文件并写入单独的文件。 ''job()''函数不需要返回任何东西。 –

+0

非常感谢。我尝试了3个和4个池,但我的四核笔记本电脑在两种情况下都冻结了。没关系,我只能使用2个池? – Tasos