2012-08-23 4 views
6

이 바보 같은 질문은, 내가 사과하고 수치에 내 머리를 숨길 갈 것이다, 그러나 : 나는 파이썬에서 작업을 큐에 RQ를 사용하고파이썬/RQ - 모니터링 작업자 상태

. 다음과 같이 작동합니다.

  1. 작업 A가 시작됩니다. Job A는 웹 API를 통해 데이터를 수집하여 저장합니다.
  2. 작업 A가 실행됩니다.
  3. 작업 A가 완료되었습니다.
  4. A가 완료되면 작업 B가 시작됩니다. 작업 B는 작업 A가 저장 한 각 레코드를 검사하고 추가 응답 데이터를 추가합니다.
  5. 작업 B가 완료되면 사용자는 보고서가 준비되었음을 알리는 행복한 전자 메일을받습니다. 지금까지

내 코드 :

redis_conn = Redis() 
use_connection(redis_conn) 
q = Queue('normal', connection=redis_conn) # this is terrible, I know - fixing later 
w = Worker(q) 
job = q.enqueue(getlinksmod.lsGet, theURL,total,domainid) 
w.work() 

가 나는 경우 작업 내 최고의 솔루션이 작업 A를 모니터링 할 수있는이 명 노동자, 작업 A의 하나 나 하나의 작업의 B 작업자 것이 었습니다 가정 및 A가 끝나면 B 작업을 시작하십시오.

내 목숨을 구하기 위해 알아 내지 못하는 것은 한 작업자가 다른 작업의 상태를 모니터하는 방법입니다. job.id로 job A의 job ID를 얻을 수 있습니다. w.name으로 작업자 이름을 가져올 수 있습니다. 그러나 그 정보를 다른 직원에게 어떻게 전달할 것인가에 관해서 가장 안 좋은 것은 아닙니다.

또는이 작업을 수행하는 훨씬 간단한 방법이 있습니까?

+1

작업 A가 완료 될 때까지 작업 B를 실행할 수 없다면 (즉, 병렬로 실행할 수 없다는 의미이므로) rq를 사용하는 이유는 무엇입니까? 순차적으로 처리하십시오 (응용 프로그램을 차단하지 않으려면 별도의 스레드 또는 프로세스로 수행) –

+0

A 및 B에 대한 작업은 각각 시간이 오래 걸리므로 별도로 처리 할 수 ​​있기를 바랍니다. 많은 일자리 A를 직업 B와 독립적으로 운영하십시오. 너무 어려울 경우 항복 할 수 있습니다. – user1066609

+0

함께가는 A와 B의 쌍을 가지고 있습니까? 아니면 어떤 B도 A에 의존 할 수 있습니까? 후자의 경우에 당신은 하나의 지옥 동기화 문제를 가지고 있기 때문에. :-) –

답변

0

프로젝트를 전환하는 데 너무 어려울 수도 있지만 그렇지 않은 경우 Twisted을 살펴보십시오. http://twistedmatrix.com/trac/ API를 사용하고 웹 콘텐츠를 스크랩하는 프로젝트에 대해 지금 당장 사용하고 있습니다. 여러 작업을 병렬로 실행하고 특정 작업을 순서대로 구성하므로 작업 B는 작업 A가 완료 될 때까지 실행되지 않습니다.

시도하고 싶을 때 Twisted를 배우기위한 최고의 튜토리얼입니다. 각 job 개체를 확인할 수 job.result에 의해 호출 result 속성을 가지고 같은 rq 문서에 this page에서 http://krondo.com/?page_id=1327

0

작업 A와 작업 B가 한 기능에서 수행하는 작업을 결합한 다음 예를 들어 사용하십시오. multiprocessing.Pool (그것의 map_async 방법) 다른 프로세스를 통해 밖으로 농장.

저는 rq에 익숙하지 않지만 multiprocessing은 표준 라이브러리의 일부입니다. 기본적으로 CPU에 코어가있는 프로세스를 사용하며, 일반적으로 시스템을 포화시키는 데 충분한 경험이 있습니다.

2

, 그것은 보인다. 작업이 완료되지 않은 경우 None이되지만 일자리가 어떤 값 (심지어는 "Done"조차도)을 반환하는 경우 다른 작업자가 첫 번째 작업의 결과를 확인하고 작업을 시작할 때만 작업을 시작할 수 있습니다. job.result에는 첫 번째 작업자가 완료되었음을 나타내는 값이 있습니다.

6

업데이트 januari 2015이 풀 요청은 이제 병합하고, 매개 변수는 depends_on로 이름이 바뀌 예 :

: 이전 버전 등을 실행하는 사람들을 위해 그대로 유지

second_job = q.enqueue(email_customer, depends_on=first_job) 

원래 포스트

RQ에서 작업 종속성을 처리하기 위해 pull 요청 (https://github.com/nvie/rq/pull/207)을 제출했습니다. 이 풀의 요청에 통합됩니다 때, 당신은 할 수 있습니다 : 지금은

def generate_report(): 
    pass 

def email_customer(): 
    pass 

first_job = q.enqueue(generate_report) 
second_job = q.enqueue(email_customer, after=first_job) 
# In the second enqueue call, job is created, 
# but only moved into queue after first_job finishes 

, 내가 순차적으로 당신의 작업을 실행하는 래퍼 함수를 ​​작성하는 것이 좋습니다. 예 :

관련 문제