Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 烧瓶:传递后台工作人员作业(rq、redis)_Python_Session_Redis_Backgroundworker_Flask - Fatal编程技术网

Python 烧瓶:传递后台工作人员作业(rq、redis)

Python 烧瓶:传递后台工作人员作业(rq、redis),python,session,redis,backgroundworker,flask,Python,Session,Redis,Backgroundworker,Flask,我想做一件非常简单的事情:启动一个worker,然后将答案返回给用户。 我正在尝试使用Flask和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 = Que

我想做一件非常简单的事情:启动一个worker,然后将答案返回给用户。 我正在尝试使用Flask和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
这个非常简单的例子中的想法是,人们去/做/然后工作开始。一段时间后,可以转到/get/并在那里打印工作人员的结果

但是,有一条线路出现了问题:

session['job'] = job
这项工作似乎不能被腌制,这显然是高射炮会议所使用的。我得到了一个错误:

...
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
我真的希望能有所帮助。我可能用了一种完全错误的方式(通过会话传递作业),但我不知道如何访问作业结果

我们将非常感谢您的帮助


提前感谢。

序列化参数有问题(您实际上试图序列化函数对象,这在
pickle
中是不可能的)

试一试


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

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

从rq.job导入作业
@app.route(“/make/”)
def make():
job=q.enqueue(做点什么,'参数')
会话['job']=job.key
返回“完成”
@app.route(“/get/”)
def get():
尝试:
job=job()
获取作业(会话['job'])
out=str(job.result)
除:
out='还没有结果'
返回

Hi@aezell您是否设法使rq与SQLAlchemy和flask一起工作。我无法通过这个问题:RuntimeError:应用程序未在db实例上注册,并且没有绑定到当前contextHi@Nguyenchechenchong的应用程序。实际上,我现在没有使用rq,只是提供了上面的一些示例代码来回答这个问题。如果没有看到一些示例代码,很难说您的问题是什么。也许值得发布一个完整的SO问题?谢谢@aezell,我设法解决了这个问题。事实上,为了拥有自己的应用程序上下文,您需要将整个应用程序导入worker。我已经习惯了Ruby和Rails的自动加载,所以我忘记了这一点。cheers@NguyenChienCong这应该是它自己的问答,这正是我遇到的问题
@app.route('/make/')
def make():
    job = q.enqueue(func=do_something, args=('argument',))
    session['job'] = job
    return 'Done'