[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.하지만이 작업이 .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.인수를 직렬화에 문제가 (실제로 피클 불가능 직렬화 기능 개체하려고).
인수를 직렬화에 문제가 (실제로 피클 불가능 직렬화 기능 개체하려고).
시험
@app.route('/make/') def make(): job = q.enqueue(func=do_something, args=('argument',)) session['job'] = job return 'Done'
from https://stackoverflow.com/questions/12162021/flask-passing-around-background-worker-job-rq-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 수평 서버에서 socket.io 사용자를 계산 (0) | 2020.01.14 |
---|---|
[REDIS] 재고 관리 시스템 NoSQL에 대 SQL (0) | 2020.01.14 |
[REDIS] 토네이도의 레디 스 연결을 처리 할 수있는 적절한 방법은 무엇입니까? (비동기 - 출판 / 하위) (0) | 2020.01.14 |
[REDIS] BLPOP를 사용하여 레디 스와 작업 대기열 (0) | 2020.01.14 |
[REDIS] 어떻게 Node.js를 동일이 개 앱 레디 스 데이터베이스를 분리하는 (0) | 2020.01.14 |