【问题标题】:Return HTTP response and continue processing - python bottle API返回 HTTP 响应并继续处理 - python bottle API
【发布时间】:2014-04-23 00:33:53
【问题描述】:

我有一个使用 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 

【问题讨论】:

标签: python multithreading asynchronous message-queue bottle


【解决方案1】:

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

【讨论】:

  • 谢谢。我最终使用了线程,但会考虑 Celery 或 python-rq 以获得更强大的未来解决方案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2017-08-27
      相关资源
      最近更新 更多