【问题标题】:How to execute function after returning Flask response (hosted on Heroku)?返回 Flask 响应(托管在 Heroku 上)后如何执行函数?
【发布时间】:2015-09-27 01:49:37
【问题描述】:

虽然我听说我需要使用一种叫做“作业队列”的东西,但我是新手,我很难设置它。在烧瓶中返回响应后如何执行函数?你能指导我完成整个过程吗?

【问题讨论】:

    标签: python heroku flask redis


    【解决方案1】:

    所以我发现它非常容易做到,而且在 heroku 上更容易,问题是文档非常分散,对于刚刚发现工作队列的人来说,这可能是压倒性的。

    对于这个例子,我将在 Heroku 上使用 Reddis To Go 插件,所以你要做的第一件事就是 从你的仪表板。 之后你设置你的烧瓶应用程序也看起来像这样:

    from flask import Flask
    from rq import Queue
    from redis import Redis
    import os
    import urllib.parse as urlparse
    
    app = Flask(__name__)
    
    def function_to_queue():
        return "finished"
    # Tell RQ what Redis connection to use and parse url from the global variable that was added by the addon
    redis_url = os.getenv('REDISTOGO_URL')
    urlparse.uses_netloc.append('redis')
    url = urlparse.urlparse(redis_url)
    conn = Redis(host=url.hostname, port=url.port, db=0, password=url.password)
    q = Queue(connection=conn)  #no args implies the default queue
    
    @app.route('/')
    def hello():
        ob = q.enqueue(function_to_queue) #Add previously defined function to queue
        return "k?"
    if __name__ == '__main__':
        app.run()
    

    接下来,您必须使用以下代码创建名为 run-worker.py 的 Python 脚本:

    import os
    import urllib.parse as urlparse
    from redis import Redis
    from rq import Worker, Queue, Connection
    
    listen = ['high', 'default', 'low']
    
    redis_url = os.getenv('REDISTOGO_URL')
    if not redis_url:
        raise RuntimeError('Set up Redis To Go first.')
    
    urlparse.uses_netloc.append('redis')
    url = urlparse.urlparse(redis_url)
    conn = Redis(host=url.hostname, port=url.port, db=0, password=url.password)
    
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()
    

    现在只需将您在 heroku 上的 Procfile 修改为如下所示:

    web: gunicorn hello:app --log-file -
    worker: python -u run-worker.py
    

    部署这个,确保你已经启动了 worker 和应用程序......然后你就完成了。希望这有助于其他人更快地了解工作排队。

    【讨论】:

      【解决方案2】:

      这对您来说可能有点晚了。但对于其他有同样问题的人来说,这可能是一个简单的解决方案:

      导入队列 导入线程 进口时间 从烧瓶进口烧瓶 从烧瓶导入 jsonify from flask_restful 导入资源,Api

      def putting_thread(q):
          while True:
              x = q.get()
              time.sleep(5)
              print(x)
      
      class make:
          def nieuw(self, queue):
              app = Flask(__name__)
              api = Api(app)
      
              api.add_resource(instructor, '/<action>', resource_class_kwargs={'queue': queue})
      
              return app
      
      class instructor(Resource):
          def __init__(self, queue):
              self.queue = queue
      
          def get(self, action = False):
              self.queue.put(action)
              return jsonify(
                  status=0
              )
      
      q = queue.Queue()
      t = threading.Thread(target = putting_thread, args = (q,), daemon = True)
      t.start()
      
      if __name__ == '__main__':
          app = make().nieuw(q)
          app.run(host='127.0.0.1', port=8081, debug=True)
      

      您可以通过以下方式对其进行测试:http://127.0.0.1:8081/sometesttext

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-04
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2018-07-09
        • 2018-06-09
        相关资源
        最近更新 更多