복붙노트

[REDIS] 플라스크 : 배경 작업자 작업 주위에 전달 (RQ, 레디 스)

REDIS

플라스크 : 배경 작업자 작업 주위에 전달 (RQ, 레디 스)

뭔가 작업자를 시작하고 다음 사용자에게 응답을 반환 : 나는 아주 간단한 일을하고 싶다. 나는 플라스크와 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

분명히 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

정말 뭔가 캔의 도움을 바랍니다. 나는 (세션을 통해 작업을 통과와) 완전히 잘못된 방법으로이 일을 할 수 있지만 나는 작업의 결과에 액세스하는 방법을 다른 아무 생각이 ...

어떤 도움을 매우 높이 평가합니다.

미리 감사드립니다.

해결법

  1. ==============================

    1.하지만이 작업이 .KEY 속성이 있음을보기 전에 나는 RQ를 사용하지했습니다. 당신의 세션에서 그 해시를 저장하는 것이 더 쉬울 수 있습니다. 그럼 당신은 그 자체가 때 .refresh을 (호출 작업 클래스의 .fetch 방법)을 사용하여 당신에게 작업을 반환 할 수 있습니다. 그 시점에서 .result ()을 읽으면 작업의 현재 상태를 줄 것이다.

    하지만이 작업이 .KEY 속성이 있음을보기 전에 나는 RQ를 사용하지했습니다. 당신의 세션에서 그 해시를 저장하는 것이 더 쉬울 수 있습니다. 그럼 당신은 그 자체가 때 .refresh을 (호출 작업 클래스의 .fetch 방법)을 사용하여 당신에게 작업을 반환 할 수 있습니다. 그 시점에서 .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
    
  2. ==============================

    2.인수를 직렬화에 문제가 (실제로 피클 불가능 직렬화 기능 개체하려고).

    인수를 직렬화에 문제가 (실제로 피클 불가능 직렬화 기능 개체하려고).

    시험

    @app.route('/make/')
    def make():
        job = q.enqueue(func=do_something, args=('argument',))
        session['job'] = job
        return 'Done'
    
  3. from https://stackoverflow.com/questions/12162021/flask-passing-around-background-worker-job-rq-redis by cc-by-sa and MIT license