【发布时间】:2015-09-27 01:49:37
【问题描述】:
虽然我听说我需要使用一种叫做“作业队列”的东西,但我是新手,我很难设置它。在烧瓶中返回响应后如何执行函数?你能指导我完成整个过程吗?
【问题讨论】:
虽然我听说我需要使用一种叫做“作业队列”的东西,但我是新手,我很难设置它。在烧瓶中返回响应后如何执行函数?你能指导我完成整个过程吗?
【问题讨论】:
所以我发现它非常容易做到,而且在 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 和应用程序......然后你就完成了。希望这有助于其他人更快地了解工作排队。
【讨论】:
这对您来说可能有点晚了。但对于其他有同样问题的人来说,这可能是一个简单的解决方案:
导入队列 导入线程 进口时间 从烧瓶进口烧瓶 从烧瓶导入 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
【讨论】: