在Python 2.6中使用回调异步执行方法

时间:2016-11-15 05:45:48

标签: python flask multiprocessing

我正在尝试执行一个耗时的后端作业,由前端调用执行。这个后端作业应该在完成时执行一个回调方法,这将释放一个信号量。前端不应该等待漫长的过程完成,以便从呼叫中得到响应以启动作业。

我尝试使用多处理库中的Pool类来解决此问题,但我遇到了一些问题。也就是说,实际执行传递给apply_async的方法的唯一方法是调用apply_async调用返回的ApplyResult对象中的.get()方法。

为了解决这个问题,我想创建一个Process对象,其目标是apply_result.get。但这似乎不起作用。

我在这里缺少一个基本的理解吗?你们有什么建议来解决这个问题。

以下是我现在所拥有的代码示例:

p = Pool(1)
result = p.apply_async(long_process, args=(config, requester), callback=complete_long_process)
Process(target=result.get).start()
response = {'status': 'success', 'message': 'Job started for {0}'.format(requester)}
return jsonify(response)

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我不太明白为什么你需要一个Process对象。看看这个片段:

#!/usr/bin/python

from multiprocessing import Pool
from multiprocessing.managers import BaseManager
from itertools import repeat
from time import sleep

def complete_long_process(foo):
    print "completed", foo

def long_process(a,b):
    print a,b
    sleep(10)    

p = Pool(1)
result = p.apply_async(long_process, args=(1, 42),
                       callback=complete_long_process)

print "submitted"
sleep(20)

如果我理解你想要实现的目标,那就是这样。一旦调用apply_async,它就会启动long_process函数并继续执行主程序。一旦完成,就会调用complete_long_process。不需要使用get方法来执行long_process,并且代码不会阻塞并等待任何内容。

如果你的long_process似乎没有运行,我认为你的问题在long_process中。

哈努哈利