我需要异步运行一些排列,以减少在列表中生成所有可能排列的文件所需的时间。我已经尝试过几次多处理,但没有成功。
所需结果:
包含以下格式的字符串列表的文件: 预 + 联接置换
其中 PRE 来自列表"前缀"
其中 JOINEDPERMUTATION 可从 " .join(x( 中找到
其中 x 是从排列(项目、重复(中找到
的ITEMS 是检索排列所需的值列表
重复 我希望在范围(8(中找到此列表的每个排列
重复items=['a','b','c']
prefix=['one','two','three']
from itertools import permutations
from multiprocessing import Pool
pool=Pool(14)
def permutations(pre, repetitions, items):
PERMS = [ pre + "".join(x) for x in permutations(items, repetitions) ]
return PERMS
def result_collection(result):
results.extend(result)
return results
results=[]
args = ((pre, repetitions, items) for pre in prefix for repetitions in range(5))
for pre, repetitions, items in args:
pool.apply_async(permutations, (pre, repetitions, items), callback=result_collection)
pool.close()
pool.join()
with open('file.txt','a',encoding='utf-8') as file:
file.writelines(results)
我本身没有收到错误,但是在运行该程序后,ITEMS有50个元素,前缀有5个元素;8小时后它还没有完成,我不知道如何进一步调查。
一个快速的旁白查询,我是否正确地认为,鉴于"pool.map"在多处理模块中基本上没有用处,因为它只会利用一个工作线程?为什么会在这里?
很难相信你本身没有收到错误,这件事应该疯狂地引发 RuntimeError。
在新生成的进程中,加载从中生成它的模块,即执行。这意味着您的代码尝试创建 14 个进程,每个进程尝试创建 14 个进程,每个进程尝试创建 14 个进程。您可能会在这里看到模式的发展:)
您必须将只能从主进程执行的所有内容放在__name__ == '__main__'
块中。这将阻止在worker中执行这些代码部分,因为对他们来说,__name__
__mp_name__
。
这样做将修复多处理部分,仍然存在另一个问题。从 itertools 导入permutations
,然后在命名空间中创建具有相同名称的函数,从而有效地覆盖 itertools 中的函数。当你的进程调用你的函数permutations
时,PERMS = [ pre + "".join(x) for x in permutations(items, repetitions) ]
行将引发一个TypeError,因为你在那里调用你的排列函数,但有两个参数,而不是函数定义所需的三个参数。
这应该做你想要的:
from itertools import permutations as it_perms
from multiprocessing import Pool
items=['a','b','c']
prefix=['one','two','three']
def permutations(pre, repetitions, items):
PERMS = [ pre + "".join(x) for x in it_perms(items, repetitions) ]
return PERMS
def result_collection(result):
results.extend(result)
return results
if __name__ == '__main__':
pool = Pool(14)
results = []
args = ((pre, repetitions, items) for pre in prefix for repetitions in range(5))
for pre, repetitions, items in args:
pool.apply_async(permutations, (pre, repetitions, items), callback=result_collection)
pool.close()
pool.join()
with open('file.txt','a',encoding='utf-8') as file:
file.writelines(results)
至于你的侧面问题:你从哪里得到pool.map((只会利用一个worker的想法?你可能想检查这个问题的答案,尤其是这个