2016-11-15 1 views
0

프런트 엔드 호출로 실행되는 시간이 많이 걸리는 백 엔드 작업을 실행하려고합니다. 이 백엔드 작업은 완료 될 때 세마포어를 해제하는 콜백 메소드를 실행해야합니다. 프론트 엔드는 긴 프로세스가 끝나기를 기다릴 필요가 없습니다. 콜에서 응답을 얻으려면 작업을 시작해야합니다.파이썬 2.6에서 콜백 메소드를 비동기식으로 실행

이 문제를 해결하기 위해 다중 처리 라이브러리의 Pool 클래스를 사용하려고하지만 몇 가지 문제가 있습니다. 즉, 실제로 apply_async에 전달 된 메서드를 실행하는 유일한 방법은 apply_async 호출에서 반환하는 ApplyResult 객체에서 .get() 메서드를 호출하는 것입니다.

이 문제를 해결하기 위해 대상이 apply_result.get 인 Process 개체를 만들려고합니다. 그러나 이것은 효과가없는 것 같습니다.

내가 여기에 실종되었다는 기본적인 이해가 있습니까? 이 문제를 해결하기 위해 무엇을 제안 하시겠습니까? 사전에 도움을

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가 호출됩니다. long_process를 실행하기 위해 get 메소드를 사용할 필요가 없으며 코드는 아무것도 차단하지 않고 기다리지 않습니다.

long_process가 실행되지 않는 것으로 보이는 경우 문제가 long_process 내에 있다고 가정합니다.

한누

관련 문제