2011-12-19 2 views
6

두 개의 서버가 있습니다 : 하나는 django 응용 프로그램을 실행하고 다른 하나는 rabbitmq 대기열과 셀러리 작업자를 실행하는 서버입니다. 다음과 같이 큐/근로자를 실행하는 서버에 내 tasks.py는 작업을 포함해당 작업을 가져올 수 없을 때 셀러리 작업 실행

@task(queue="reports") 
def test_task(): 
    time.sleep(120) 

내 목표는 장고보기에서이 작업을 실행하는 것입니다. 작업에 대한 코드가 장고보기와 다른 서버에 있기 때문에 작업을 호출하고 싶습니다. 다음 코드를 사용하여 장고에서 작업자 시스템으로 작업을 보내려고합니다.

send_task("tasks.test_task", task_id=task_id, args=[], kwargs={}, publisher=publisher, queue=queue) 

나는이 방법 here을 찾았지만, 지금까지 근무하지 않은 테스트.

셀러리 작업자 서버의 셀러리 작업자 로그 파일에서 tail -F로 테스트 한 다음 브라우저에서 send_task가 포함 된보기의 URL로 이동합니다. 나는 테일 출력에 '수신 됨'으로 표시 할 작업을 찾고 있지만 그렇지 않습니다.

샐러리 작업자의 로그 수준은 DEBUG이고 로그 파일은 작업이 적절한 이름으로 등록되어 있고 django 앱의 settings.py에 rabbitmq 서버에 대한 올바른 IP와 자격 증명이 포함되어 있음을 보여줍니다. 다른 접근법을 시도하면서 send_task에 전달 된 문자열을 유효한 작업 (예 : send_task ('asdf'))으로 변경했을 때 샐러리 로그 파일에 오류 메시지가 표시되는 경우가있었습니다. 이로 인해 로그 파일에 UnregisteredError가 발생했습니다. 그러나 이는 때로는 발생하며 설정과 호출의 다양한 조합을 테스트 할 때 동작을 확실하게 복제하는 방법을 찾지 못했습니다.

CELERY_RESULT_BACKEND = 'amqp' 
BROKER_HOST = 'the.correct.IP.address' 
BROKER_USER = 'the_correct_user' 
BROKER_PASSWORD = 'the_correct_pass' 
BROKER_VHOST = 'the_correct_vhost' 
BROKER_PORT = 5672 

내가 주변에 검색 좀했는데 send_task에 훨씬 못 찾았 :

또한,이 (제거 실제 값) 장고 프로젝트에 settings.py의 관련 부분이다. 내가 잘못하고있는 것에 대한 아이디어가 있습니까?

+0

두 컴퓨터간에 코드를 어떻게 공유했는지 알고 싶습니다. 여기에 그와 관련된 질문이 있습니다 : http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server 감사합니다! – lajarre

답변

7

해결되었지만 send_task에 전달한 게시자 키워드 arg가 잘못되어 오류가 발생했습니다. AJAX에서 직접 페이지를 탐색하지 않고 페이지를 요청했기 때문에 오류가 표시되지 않았습니다. 이 상황에 관한 모든 것이 옳았다. 불필요한 키워드 인 args와 arg를 send_task에 전달했습니다.

send_task("tasks.test_task", task_id=task_id, queue=queue) 
2

[당신이 생각한] 일은 불가능합니다. 셀러리 작업자는 실행할 작업 코드에 액세스해야합니다. 그 주위에 방법이 없습니다.

개정 :

그러나 무엇 당신이 정말로 원하는 : 이름으로 만 작업을 참조해야 장고보기에 노동자 사용할 수 있지만 코드가 있습니다.

+0

셀러리 작업자가 실행할 코드가 필요하다는 것은 옳은 생각입니다.하지만 원래 게시물의 일부를 잘못 이해했다고 생각합니다. 명확하게 말하면, 작업자는 작업 코드를 가지고 있습니다 - 원격으로 수행하고 싶은 작업의 호출입니다. 따라서 django 뷰는 작업자에게 작업을 실행하도록 지시합니다. –

+0

수정 된 개정! – dkamins