多处理 - 异步处理,但基于函数参数的块

时间:2017-10-01 03:56:54

标签: python asynchronous multiprocessing

我正在使用多处理来反复调用许多不同参数的外部可执行文件。对我来说,可执行文件是一个黑盒子,可以读取/写入其目录中的文件。因此,我有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的可执行调用已经足够快了,但由于某些函数参数需要更长的时间来处理可执行文件,因此我不可避免地会发生冲突。

0 个答案:

没有答案