Flasche: herumreichen Hintergrund Arbeiterjob (rq, redis)
Ich möchte eine sehr einfache Sache tun: Starten Sie einen Arbeiter zu etwas und geben Sie dann die Antwort an den Benutzer zurück. Ich versuche es mit einer Kombination aus Flask und 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
Die Idee in diesem sehr einfachen Beispiel ist, dass die Leute zu / make / gehen und der Job beginnt. Nach einiger Zeit kann dort nach / get / gegangen werden und das Ergebnis des Workers wird dort ausgedruckt.
Eine Zeile verursacht jedoch Probleme:
session['job'] = job
Es scheint, dass der Job nicht gebeizt werden kann, was anscheinend von der Flaks-Sitzung verwendet wird. Ich erhalte den Fehler:
...
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
Ich hoffe wirklich, dass etwas helfen kann. Ich mache das möglicherweise auf eine völlig falsche Weise (mit Übergabe des Jobs über eine Sitzung), aber ich habe keine Ahnung, wie ich sonst auf das Ergebnis des Jobs zugreifen soll ...
Jede Hilfe wird sehr geschätzt.
Danke im Voraus.