8

私は非常に単純なことをしたい: 何かに対してワーカーを起動し、ユーザーに答えを返します。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

この非常に単純な例のアイデアは、人々が /make/ にアクセスするとジョブが開始されるというものです。しばらくすると /get/ に移動でき、ワーカーからの結果がそこに出力されます。

ただし、1行が問題を引き起こしています:

session['job'] = job

どうやらFlaksセッションで使用されているようです。エラーが発生します:

...
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

何かお役に立てば幸いです。私はこれを完全に間違った方法で(セッションを介してジョブを渡すことで)行っている可能性がありますが、ジョブの結果にアクセスする方法が他にわかりません...

どんな助けでも大歓迎です。

前もって感謝します。

4

2 に答える 2

3

以前は使用したことがありませんが、ジョブにはプロパティrqがあることがわかりました。.keyそのハッシュをセッションに保存する方が簡単かもしれません。次に、それ自体が a を呼び出してジョブを返す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
于 2012-08-30T15:25:28.270 に答える
2

引数のシリアル化に問題があります (実際には では不可能な関数オブジェクトをシリアル化しようとしていますpickle)。

試す

@app.route('/make/')
def make():
    job = q.enqueue(func=do_something, args=('argument',))
    session['job'] = job
    return 'Done'
于 2012-08-28T15:27:10.623 に答える