使用多处理或twisted在python中异步生成结果
我有一个令人尴尬的并行应用程序,结果的顺序无关紧要 我有一个函数和一个包含1000个参数的列表。不过,每个函数都返回相当多的数据 我已经编写了一些多处理代码来并行化它使用多处理或twisted在python中异步生成结果,python,multiprocessing,twisted,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_ret
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
在多重处理中,我似乎找不到解决这个问题的方法。我听说过twisted的优点,但我不确定这项简单的任务是否有过之而无不及
有人知道如何制作一个python生成器来异步计算结果,并在结果出现时生成结果吗 在Python3中:concurrent.futures就是这样。python 2可能有一个后端口,我还没有检查。为什么不直接使用Pool.map而不是Pool.apply\u async呢?因为您只是在等待结果,所以使用异步变量在这里没有什么用处。如果我正确阅读了文档,apply只使用一个worker。
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