2016-11-15 60 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