2013-08-25 42 views
19

我們有一臺運行芹菜工作服務器和一個Redis隊列的服務器。任務在該服務器上定義。
我需要能夠從遠程機器調用這些任務。
我知道這是使用send_task完成的,但我仍然沒有想出如何?我如何告訴send_task隊列在哪裏?我在哪裏傳遞連接參數(或任何需要的)?我一直在尋找了幾個小時,所有我能找到的是:芹菜 - 如何從遠程機器發送任務?

from celery.execute import send_task 
send_task('tasks.add') 

嗯,這意味着我需要celery我的呼喚機器上也是如此。但是我還需要設置什麼?

回答

30

這可能是一個辦法: 創建芹菜對象,並使用send_task從該對象,該對象可以配置找經紀人。

from celery import Celery 
celery = Celery() 
celery.config_from_object('celeryconfig') 
celery.send_task('tasks.add', (2,2)) 

celeryconfig是一個包含芹菜配置的文件,在芹菜對象上還有其他的配置方法。

在遠程機器上
+2

我最近有一個類似的問題,通過send_task調用是正確的,但是這個任務沒有被服務器找到。我收到錯誤「收到未註冊的任務類型...」。爲了解決這個問題,在你的任務定義裝飾器中添加'name'參數。示例可以在[這裏]找到(https://gist.github.com/johnpaulhayes/8403108) – johnpaulhayes

+0

好的,這是偉大的人......現在是一個真正的考驗。你如何利用這個回調來獲得從任務返回的實際值? – chuckjones242

+2

把我扔了幾個小時的東西是我需要定義我的製作腳本將哪個隊列放入「作業」。以'celery.send_task('tasks.the_remote_task_name',([arguments,...]), queue ='name_of_queue')'從此[鏈接]獲得(https://www.marshut.net/ipwtin /sending-tasks-from-a-machine-and-running-celery-workers-on-another-machine.html) – lukik

0

有幾種方法可以定義路由規則,其中最常用的是自定義路由器對象。在所有情況下,呼叫者僅在send_task,delayapply_async中提供routing_key參數,並且路由器確定將任務發送到哪個隊列。

+0

謝謝,但這使我回到起點。我在哪裏定義此路線密鑰?在呼叫機器上需要配置文件嗎?或者在調用'send_task'之前還有其他需要配置的東西嗎? – user1102018

+0

http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#id13中的示例演示瞭如何創建配置文件,以及如何在配置文件中定義路由。由於您的經紀人是REDIS,您確實需要呼叫機器上的配置文件。 (如果您使用的是AMQP,則可以選擇在Rabbit層中定義路由規則)。 –

+0

您提到的文檔沒有解釋如何告訴send_task使用redis。它只解釋瞭如何設置工作人員。通過這樣做,send_task返回「連接被拒絕」錯誤(至少對我來說) – AliBZ

1

,啓動芹菜與broker_url指向要在運行任務的機器。然後,只需提交任務(如果您有要提交的特定隊列,則添加相應的路由鍵)。

-2

你發現的是對的。

from celery.execute import send_task 

send_task('tasks.add') 

如果任何ARGS需要

send_taks('tasks.add', kwargs={'a'=1, 'b'=2})