2011-12-19 147 views
6

我有兩臺服務器:一個運行的Django應用程序和一個同時運行一個RabbitMQ的隊列和芹菜工人。我的運行隊列/工人在服務器上tasks.py包含一個任務如下:運行芹菜任務時無法導入任務

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

我的目標是從一個Django視圖下執行任務。由於該任務的代碼與django視圖不同,我想調用該任務,因此我試圖使用以下代碼將任務從django發送到工作器。

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

我發現這種方法here,但到目前爲止測試它沒有奏效。

我與芹菜工人服務器上的芹菜工人日誌文件尾部-F測試,然後導航到包含在瀏覽器send_task視圖的URL。我正在尋找在尾部輸出中顯示爲「已收到」的任務,但事實並非如此。

芹菜工作者的日誌級別是DEBUG,日誌文件顯示該任務已註冊了正確的名稱,而django應用程序的settings.py包含rabbitmq服務器的正確IP和憑證。在嘗試不同的方法時,當我將傳遞給send_task的字符串更改爲不是有效任務的字符串(即send_task('asdf'))時,偶爾會在芹菜日誌文件中看到一條錯誤消息。這導致了日誌文件中的UnregisteredError。然而,這只是偶爾發生的,到目前爲止,在測試設置和調用的不同組合時,我還沒有找到可靠地複製行爲的方法。

此外,這是settings.py對Django項目的相關部分(與實際值去掉):

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。關於我可能做錯什麼的想法?

+0

我很想知道如何在兩臺機器之間共享代碼。這裏是我寫的相關問題:http://stackoverflow.com/questions/28592243/celery-tasks-functions-web-server-vs-remote-server謝謝! – lajarre 2015-02-19 15:30:02

回答

7

解決了,原來出版商關鍵字ARG我被傳遞到send_task是無效的,並拋出一個錯誤。沒有看到錯誤,因爲我是AJAX--請求頁面而不是直接導航到頁面。關於這種情況的一切都是正確的。我還刪除了傳遞給send_task的不必要的關鍵字args和args。

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

什麼[我還以爲你]試圖做是不可能的。芹菜工人需要訪問他們要運行的任務代碼。這是沒有辦法的。

修訂:

但你真的想要做的是:有Django的視圖,它應該只按名稱引用任務提供給工人,但不是代碼。

+0

你絕對正確,芹菜工人需要他們將運行的代碼,但我認爲你誤解了原始帖子的一部分。要清楚的是,工作人員上面有任務代碼 - 這是我想要遠程執行的任務*調用。所以django視圖告訴工作者運行任務。 – 2011-12-20 04:52:24

+0

修訂修訂! – dkamins 2011-12-20 07:37:37