在python中创建并行for循环

时间:2018-08-24 15:01:09

标签: python python-2.7 multiprocessing python-multiprocessing

我查看了类似的问题,尤其是this答案。我的情况有所不同,所以要提问。

import os
import multiprocessing as mp

def fun1(str1):
 #function def

if __name__ == '__main__':


    pl1 = mp.Pool(processes=2)
    pl2 = mp.Pool(processes=2)

for (d1,d2,d3) in os.walk('dirname'):
    for d4 in d2:
        pl1.map(fun1,d4)

    for d5 in d3:
        pl2 .map(fun1,d5)
#

我正在以字符串形式获取文件和目录名称,并将其传递给fun1()。但是问题在于,如果我使用pl1.map(fun1,d4),看起来python会分隔每个字符串字符并将单个字符传递给fun1()。我希望将整个字符串d4,d5传递给fun1(),并并行传递以减少运行时间。我创建了两个池pl1,pl2,以便可以在顶级for循环中单独使用它们,而不会引起任何问题。

有什么办法解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

multiprocessing doc开始使用Pool.map方法:

  

此方法将迭代器切成多个块,作为单独的任务提交给进程池。

因此它将字符串d4视为可迭代的,并按字母顺序(一个接一个)将其发送到进程。您可能正在寻找Pool.apply_async:

pl1.apply_async(fun1, d4)

或者只是将 d2 传递到池中(不使用for循环“ for d2中的d4 ”):

pl1.map(fun1, d2)

编辑-最终代码可能像这样:

for (d1,d2,d3) in os.walk('dirname'):
    pl1.map(fun1,d2)
    pl2.map(fun1,d3)

答案 1 :(得分:0)

据我了解,多处理模块是通过在后台使用C来优化的。因此,与ctypes合作可能是解决您的问题的方法:

from ctypes import c_char_p
from multiprocessing import Process, Manager, Value, Pool

manager = Manager()
pool = Pool(processes=2)
pool2 = Pool(processes=2)
for (d1,d2,d3) in os.walk('dirname'):
    for d4 in d2:
        d4_string = manager.Value(c_char_p, d4)
        pool.map(fun1, d4_string)
        pool.join()

    for d5 in d3:
        d4_string = manager.Value(c_char_p, d4)
        pool2.map(fun1, d4_string)
        pool2.join()