Python Multiprocessor和要传递给函数的变量列表

时间:2014-01-09 03:51:47

标签: python multiprocessing

好的,所以我从来没有使用过python多处理库,我真的不知道怎样写我的搜索。我阅读了图书馆的文档,我试图搜索我的问题的例子,我找不到任何东西 我有一个文件名列表(~2400),一个字典(称为cond,是一个全局)和一个函数。我想在每个处理器上运行我的函数,每次函数运行时,它都使用其中一个文件名作为变量。所以我希望它运行4个进程,每个处理器运行1个,并且它应该在列表中工作,当一个函数结束时,它会进入列表中的下一个项目,并且每个函数都将更新一个单一共享字典。

Psudofunction代码:

def PSC(fnom):
    f = open(fnom,"r")
    r = xml.dom.minidom.parse(f)
    cond[fnom] = otherfunc(r)
    f.close()

所以,a)是否可以对此函数使用多处理,b)如果是,多处理库中的哪种方法能够处理它,c)如果你特别好,我该怎么迭代通过列表每次将每个项目作为arg传递。

关于它的工作方式的思考(psudo bulls *** code):

if __name__ == __main__:
    name_list = name_list_func()
    method = multiprocessing.[method]() #no idea what method
    method.something(target=PSC, iter=name_list) #no idea either

1 个答案:

答案 0 :(得分:0)

除了“单一共享字典”部分外,这很容易。进程不共享内存。这是一个谎言,但这是你应该首先相信的一个;-)我将把这个词汇保留在主要程序中,因为这比任何实际的共享词典的方式更强大过程:

NUM_CPUS = None # defaults to all available cores

def PSC(fnom):
    return fnom, len(fnom)

if __name__ == "__main__":
    import multiprocessing as mp
    pool = mp.Pool(NUM_CPUS)
    list_of_strings = list("abcdefghijklm")
    cond = {}
    for fnom, result in pool.imap_unordered(PSC, list_of_strings):
        cond[fnom] = result
    pool.close()
    pool.join()
    print cond

你可以实际运行的代码。插入文件打开,XML解析等不会改变使多处理部分正常工作所需的任何内容。

在当前的Python 3中,这可以更简单一些。这里的代码适用于Python 2。

请注意,您也可以使用imap_unordered()imap()代替map()imap_unordered()为实现提供了尽可能有效地安排事物的最大自由,尽管到目前为止,实现并不是非常聪明,无法充分利用它。展望未来; - )