在 python 中创建并行 for 循环



我看过类似的问题,尤其是这个答案。我的情况有点不同,所以问问题。

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创建了 2 个池,以便它们可以在顶级循环中单独使用for而不会引起任何问题。

知道如何解决这个问题吗?

来自 Pool.map 方法的多处理文档:

此方法将可迭代对象切成多个块,并将其作为单独的任务提交到进程池。

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

pl1.apply_async(fun1, d4)

或者简单地将d2传递给池(不使用 for 循环">for d4 in d2"(:

pl1.map(fun1, d2)

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

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

据我了解,多处理模块是通过在幕后使用 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()

相关内容

  • 没有找到相关文章

最新更新