Python多处理器和要传递给函数的变量列表

2024-05-29 02:52:40 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,所以我从来没有使用过python多处理库,我也不知道如何使用我的搜索。我阅读了图书馆的文档,我试图寻找我的问题的例子,但什么也找不到。
我有一个文件名列表(~2400)、一个字典(称为cond,是全局的)和一个函数。我想在每个处理器上运行我的函数,每次函数运行时它都使用其中一个文件名作为变量。因此,我希望它运行4个进程,每个处理器1个,它应该在列表中按自己的方式运行,当一个函数结束时,它将进入列表中的下一项,并且这些函数中的每一个都将更新一个共享字典。你知道吗

PSUDO功能代码:

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***代码):

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

Tags: 函数no代码name列表字典文件名方式
1条回答
网友
1楼 · 发布于 2024-05-29 02:52:40

这很简单,除了“单一共享字典”部分。进程不共享内存。这是个谎言,但这是你首先应该相信的;—)我将把dict保存在主程序中,因为这比任何实际的跨进程共享dict的方法都要有效:

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解析等,不会改变使多处理部分正常工作所需的任何内容。你知道吗

在当前的python3中,这可以变得简单一点。这里的代码是针对python2的。你知道吗

请注意,除了imap_unordered(),还可以使用imap()map()imap_unordered()为实现提供了尽可能高效地安排事情的最大自由度,尽管到目前为止,实现还没有足够的智能来充分利用这一点。展望未来;—)

相关问题 更多 >

    热门问题