动态加载模块的多处理

问题描述

我有一些在大约15000个输入上执行的代码。 每个输入包含一个目录路径,以及该目录应执行的python脚本的路径。例如说有一个脚本example.py是

def get_features(path):
    results = []
    for f in os.listdir(path):
        if os.path.isfile(os.path.join(path,d):
            results.append(do_some_stuff(os.path.join(path,f)))
    return results

可以有2到10个左右的脚本,例如example.py ...在我的程序中,我像这样加载这些脚本:

for script_name,script_path in scripts:
    spec = importlib.util.spec_from_file_location('{}.script'.format(script_name),script_path)
    modules[script_name] = importlib.util.module_from_specs(spec)
    spec.loader.exec_module(modules[script_name])

然后我将输入中的每个目录路径匹配到元组列表中的相应脚本,最后在循环中为每个目录调用脚本

for dir_path,loaded_script in work_list:
    result = loaded_script.get_features(dir_path)
    results_set.update(result)

这个循环需要很长时间,所以我想使用一个多处理池来加快速度,就像这样

def worker(path,func):
    return func(path)
p = multiprocessing.Pool(6)
all_results = p.starmap(worker,work_list)
results_set = set([item for res_list in all_results for item in res_list])

但是我不能这样做,因为一个模块(参数列表中每个元组中的第二个对象)是不可腌制的,我会得到一个PicklingError ... 我曾想过将路径传递给脚本,而不是将加载的模块传递给worker方法,但是由于该方法调用次数远大于不同脚本的数量,因此每次重新加载模块似乎非常浪费... 有没有办法将模块传递给辅助方法进行多处理?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)