使用多处理或扭曲在python中异步生成yield

时间:2014-04-28 21:16:23

标签: python multiprocessing twisted

我有一个令人尴尬的并行应用,其中结果的顺序并不重要。

我有一个函数和一个1000个参数的列表。每个函数都会返回相当多的数据。

我已经编写了一些多处理代码来并行化它。

def _process_parallel(func, args_list, args_dict={}):
    num_tasks = len(args_list)
    num_tasks_returned_ptr = [0]
    def _callback(result):
        num_tasks_returned_ptr[0] += 1
    # Send all tasks to be executed asynconously
    apply_results = [__POOL__.apply_async(func, args, args_dict, _callback)
                     for args in args_list]
    # Wait until all tasks have been processed
    while num_tasks_returned_ptr[0] < num_tasks:
        #print('Waiting: ' + str(num_tasks_returned_ptr[0]) + '/' + str(num_tasks))
        pass
    # Get the results
    result_list = [ap.get() for ap in apply_results]
    return result_list

我发现内存占用过高。目前,在处理完所有结果之前,不会丢弃这些函数的结果。

我想要做的是在结果执行后不存储的结果。像这样:

def _process_parallel(func, args_list, args_dict={}):
    # Send all tasks to be executed asynconously
    for result in somepackage.apply_async(func, args, args_dict, _callback):
        yield result

我似乎无法在多处理中找到解决方法。我听说过扭曲的好事,但我不确定这个简单的任务是否有些过分。

有没有人知道如何制作一个python生成器来异步计算结果并在它们进来时产生它们?

0 个答案:

没有答案