我正在使用多处理来反复调用许多不同参数的外部可执行文件。对我来说,可执行文件是一个黑盒子,可以读取/写入其目录中的文件。因此,我有4个可执行文件的副本,每个副本都在自己的目录中。这允许我一次运行可执行文件4而不会发生冲突。
最初我尝试过这样的事情
PROCESSES = 4
with multiprocessing.Pool(PROCESSES) as pool:
exe_list = [ii for ii in range(4)]*10
TASKS = ((pyfcn, (ii, ex)) for ii, ex in enumerate(exe_list))
results = [pool.apply_async(calculate, t) for t in TASKS]
print('Ordered results using pool.apply_async():')
for r in results:
print('\t', r.get())
print()
演示调用python函数,然后调用外部可执行文件。 exe_list
是一个[0,1,2,3,0,1,2,...]
指定可执行文件的列表。 ii
只是实际函数参数的一个代表,它也传递给可执行文件。虽然这个方法按顺序返回结果(我想要的),但是如果使用可执行文件2的进程在完成3,0和1之前没有完成,那么当另一个进程尝试开始使用可执行文件2时,我会发生冲突
如何按顺序获取结果,异步使用处理器,还可以防止正在调用的外部可执行文件的冲突?基本上,只有当我经历了4个可执行文件的循环而且还没有完成时,我才想“阻止”。
也许7/10的可执行调用已经足够快了,但由于某些函数参数需要更长的时间来处理可执行文件,因此我不可避免地会发生冲突。