我正在尝试执行一个耗时的后端作业,由前端调用执行。这个后端作业应该在完成时执行一个回调方法,这将释放一个信号量。前端不应该等待漫长的过程完成,以便从呼叫中得到响应以启动作业。
我尝试使用多处理库中的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)
提前感谢您的帮助!
答案 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中。
哈努哈利