1

我正在深入研究 python 的多处理世界。

在观看了一些视频后,由于我的职能性质,我提出了一个问题。

这个函数有 4 个参数:

  1. 第一个参数是要读取的文件,因此,这是要读取的文件列表。
  2. 以下 2 个参数是两个不同的字典。
  3. 最后一个参数是可选参数“debug_mode”,需要设置为“True”
# process_data(file, signals_dict, parameter_dict, debug_mode=False)
file_list = [...]
t1 = time.time()
with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(process_data, file_list)
t2 = time.time()

问题是:如何为函数指定其余参数?

提前致谢

4

2 回答 2

2

ProcessPoolExecutor.map文档薄弱。worker 接受一个参数。如果您的目标具有不同的调用签名,则需要编写一个中间工作程序,该工作程序传递一个容器并知道如何将其扩展到参数列表中。该文档也未能明确说明您需要等待作业完成才能关闭池。如果您启动作业并退出池上下文with子句,则池将终止。

import concurrent.futures
import os

def process_data(a,b,c,d):
    print(os.getpid(), a, b, c, d)
    return a

def _process_data_worker(p):
    return process_data(*p)

if __name__ == "__main__":
    file_list = [["fooa", "foob", "fooc", "food"],
        ["bara", "barb", "barc", "bard"]]

    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = executor.map(_process_data_worker, file_list)

for result in results:
    print('result', result)
于 2020-05-13T14:47:44.833 回答
0

您需要为每个进程创建一个包含参数的列表列表:

params_list = [[file1, dict1_1, dict2_1, True],
               [file2, dict1_2, dict2_2, True],
               [file3, dict1_3, dict2_3]]

然后,您可以创建如下流程:

executor.map(process_data, params_list)
于 2020-05-13T02:52:10.443 回答