2017-12-22 9 views
0

10 초에서 처리하지만 10 초 후 사용자에게 정보를 반환 할 필요는 없지만 dynamoDB에 기록합니다. 그래서 사용자가 10 초를 기다리지 않아도되기를 바랍니다. 대신 게시 요청 후 즉각적인 "성공"응답을 보내고 싶습니다.I immedite 응답을 반환하고 플라스크로 처리 한 후 처리합니다.

나는 두 개의 게시물을 읽고 this 하나는 Teardown Callback으로 대답했지만 예제는 없었습니다.

나는 그 때 읽었다 this, 그러나 나의 문제에 저를 돕지 않는다.

나는 물론 teardown-callbacksthis pattern을 읽었지 만 나는 그것을 다른 방법으로 어떻게 사용할 수 있을지 모른다.

내 코드는 다음과 같습니다

@app.route('/ocr/read_image', methods=['POST']) 
def get_text():  
    return jsonify('Success') 

@app.teardown_request 
def teardown_request(response):   
    time.sleep(10) 

그것은 실제로 "성공"메시지를 반환하지만 불과 10 초 후.

10 초 전에 "Succes"메시지를 반환 할 수있는 방법이 있습니까?

나는 샐러리와 함께 가능할 수도 있다고 읽었지 만 할 수 있으면 그것을 피하는 것을 좋아할 것입니다.

누구나 방법을 알고 있습니까?

답변

0

Ardaglio가 말했듯이, 가장 좋은 방법은 멀티 스레딩을 사용하는 것입니다.

저는 셀레 리를 사용하지 않았습니다. 꽤 복잡하고 제 문제가 아주 쉽기 때문입니다.

from threading import Thread 

@app.route('/ocr/read_image', methods=['POST']) 
def get_text():  
    Thread(target=continue_processing).start() 
    return jsonify('Success') 

def continue_processing(): 
    time.sleep(10) 
    print('Hi') 

을, 당신은 조심해야 해 :

그래서, 난 스레드를 사용하고 있습니다. Tensorflow와 함께 백엔드로 Keras를 사용하고 있습니다. 사용하면 좋은 값의 오류가 발생합니다. ValueError: Tensor Tensor()is not an element of this graph.

그래서 스레드 내부에서 피하기 위해 모델을 만든 후에 그래프를 저장해야합니다. :

GRAPH = tf.get_default_graph()

다음은 asynchron 프로세스 내에서이 방법을 사용했습니다 :

with GRAPH.as_default(): 
    do something with your model 

이 누군가를 도울 수있는 희망을.

1

셀러리가 작업을 완료 할 수 있습니다.

일부 비동기 프로세스를 수행해야합니다. 즉, 정보를 처리하기 위해 '누군가'라고 부른 다음 처리 된 정보가 반환되기를 기다리지 않고 사용자/응용 프로그램에 메시지를 보냅니다.

그런 다음 처리를 마쳤 으면 콜백을 추가하여 다른 것을 알릴 수 있습니다.

셀러리 또는 RabbitMQ로 수행 할 수있는 모든 작업.