返回HTTP响应并继续处理 - python bottle API

时间:2014-03-17 16:58:58

标签: python multithreading asynchronous message-queue bottle

我有一个使用Python瓶子的分析服务,通过将url发布到原始数据来调用。

立即向被调用者返回200响应并继续处理应用程序中可能长时间运行的逻辑的最简单/最干净/最佳方法是什么?

产生一个新的线程/进程?使用队列?异步?

from bottle import post, HTTPResponse, request

@post('/postprocess')
def records():
   data_url = request.json.get('data_url', False)
   postback_url = request.json.get('postback_url', False)

   if not data_url or not postback_url:
       return HTTPResponse(status=400, body="Missing data paramater")

   #Immediately return response to callee
   return HTTPResponse(status=200, body="Complete")

   #Continue processing long-running code
   result = get_and_process_data(data_url)
   #POST result to another endpoint 

3 个答案:

答案 0 :(得分:1)

没有最简单的解决方案。对于生产系统,我首先会研究为这些情况创建的现有系统,以确定这是否适合,如果不是,那么只能开发更适合我的情况的东西。为此,我建议你看一下Celery

答案 1 :(得分:0)

我建议使用一些排队机制来排队需要处理的数据。然后,您可以实现一个可以处理Q的工作池。

然后,您可以利用Q监控工具解决任何性能问题,并且您的工作池可以根据需要进行扩展。

答案 2 :(得分:0)

我最近找到了一个非常简单的解决方案。

from threading import Thread    
@app.route('/')  
def send_response():
    uri = request.args
    ua = request.headers['user-agent']
    token = request.args.get("token")
    my_thread = Thread(target=process_response, args=[uri,
                                                      ua,
                                                      token])
    my_thread.start()
    res = Response(status=200,
                   mimetype='application/json')
    return res
        
def process_response(uri, ua, token):
    print(uri)
    print(ua)
    print(token)
    pass