虽然我听说过我需要使用一种叫做“工作队列”的东西我是新手,我很难把它全部搞定。如何在烧瓶中返回响应后执行功能?你能指导我完成这个过程吗?
答案 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
部署它,确保你同时启动了工作者和应用程序......宣布你已经完成了。希望这有助于其他人更快地了解排队工作。