返回Flask响应后如何执行函数(托管在Heroku上)?

时间:2015-07-08 22:11:38

标签: python heroku flask redis

虽然我听说过我需要使用一种叫做“工作队列”的东西我是新手,我很难把它全部搞定。如何在烧瓶中返回响应后执行功能?你能指导我完成这个过程吗?

1 个答案:

答案 0 :(得分:3)

所以我想到的是,它非常容易做到,而且在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

部署它,确保你同时启动了工作者和应用程序......宣布你已经完成了。希望这有助于其他人更快地了解排队工作。