2016-11-15 28 views
0

我试图执行一个耗时的后端作业,由前端调用执行。这个后端作业在完成时应该执行一个回调方法,这将释放一个信号量。前端不需要等待漫长的过程才能完成,以便获得电话响应以启动工作。在Python 2.6中使用回调异步执行方法

我想从多处理库中使用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

我不太明白你为什么需要一个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内的某个地方。

Hannu