Flask:传后台工作(rq,redis)

2024-06-01 07:08:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我想做一件非常简单的事情:启动一个worker到某个东西,然后将答案返回给用户。 我试着用烧瓶和RQ相结合的方法。在

import os
from flask import Flask, session
from somewhere import do_something
from rq import Queue
from worker import conn

app = Flask(__name__)
app.debug = True
app.secret_key = '....'

q = Queue(connection=conn)

@app.route('/make/')
def make():
    job = q.enqueue(do_something, 'argument')
    session['job'] = job
    return 'Done'

@app.route('/get/')
def get():
    try:
        session['job'].refresh()
        out = str(session['job'].result)
    except:
        out = 'No result yet'
    return out

在这个非常简单的例子中,人们去做/做/然后工作就开始了。过一段时间后,可以转到/得到/工人的结果将打印在那里。在

然而,有一条生产线引发了问题:

^{pr2}$

看来这份工作是不能腌制的,这显然是在高射训练中使用的。我得到了一个错误:

...
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/lib/python2.7/site-packages/flask/app.py", line 804, in save_session
10:52:16 web.1     |     return self.session_interface.save_session(self, session, response)
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/lib/python2.7/site-packages/flask/sessions.py", line 205, in save_session
10:52:16 web.1     |     secure=secure, domain=domain)
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 329, in save_cookie
10:52:16 web.1     |     data = self.serialize(session_expires or expires)
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 235, in serialize
10:52:16 web.1     |     self.quote(value)
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/lib/python2.7/site-packages/werkzeug/contrib/securecookie.py", line 192, in quote
10:52:16 web.1     |     value = cls.serialization_method.dumps(value)
10:52:16 web.1     |   File "/Users/julius/twitter-sentiment/venv/bin/../lib/python2.7/copy_reg.py", line 70, in _reduce_ex
10:52:16 web.1     |     raise TypeError, "can't pickle %s objects" % base.__name__
10:52:16 web.1     | TypeError: can't pickle function objects

我真的希望能有所帮助。我可能做这件事的方式完全错误(通过一个会话传递任务),但我不知道如何才能访问作业的结果。。。在

任何帮助将不胜感激。在

提前谢谢。在


Tags: inpyimportappvenvsessionlibline
2条回答

我以前没有使用过rq,但是我看到一个作业有一个.key属性。在会话中存储散列可能更容易。然后可以使用Job类的.fetch方法,该方法本身将调用.refresh(),并将作业返回给您。此时读取.result()将显示作业的当前状态。在

可能是这样(未经测试):

from rq.job import Job

@app.route('/make/')
def make():
    job = q.enqueue(do_something, 'argument')
    session['job'] = job.key
    return 'Done'

@app.route('/get/')
def get():
    try:
        job = Job()
        job.fetch(session['job'])
        out = str(job.result)
    except:
        out = 'No result yet'
    return out

序列化参数时出现问题(您实际上试图序列化函数对象,这是pickle无法实现的)。在

试试看

@app.route('/make/')
def make():
    job = q.enqueue(func=do_something, args=('argument',))
    session['job'] = job
    return 'Done'

相关问题 更多 >