2013-08-25 10 views
19

セロリの作業者とRedisキューを実行するサーバーがあります。タスクは、そのサーバーで定義されています。
これらのタスクをリモートマシンから呼び出せるようにする必要があります。
私はそれがsend_taskを使用して行われていることを知っていますが、私はまだ考え出していませんか?キューがどこにあるのかをsend_taskに伝えるには?接続パラメータ(または必要なもの)はどこに渡すのですか?私は時間を探してきたと私は見つけることができるすべてはこれです:セロリ - リモートマシンからタスクを送信するには?

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

、それは私も私の呼び出し元のマシン上でceleryが必要であることを意味します。しかし、私は何をセットアップする必要がありますか?

答えて

30

これは方法です。 Celeryオブジェクトを作成し、そのオブジェクトからsend_taskを使用すると、オブジェクトはブローカを見つけるための構成を持つことができます。

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

セロリ構成はセロリ構成を含むファイルです。セロリオブジェクトに設定する方法は他にもあります。

+2

私は最近、send_task呼び出しが正しいが、サーバーがタスクを見つけられなかった同様の問題があった。 「タイプの未登録タスクを受け取りました...」というエラーが表示されました。これを解決するには、タスク定義のdecoratorに 'name'引数を追加します。例が見つかりました[ここ](https://gist.github.com/johnpaulhayes/8403108) – johnpaulhayes

+0

OK、これは素晴らしい人です...今は本当のテストです。そのコールバックをどのように活用すれば、タスクから返された実際の値を得ることができますか? – chuckjones242

+2

何時間も私を捨ててしまったのは、私の製作スクリプトが「仕事」をしているキューを定義する必要があるということでした。最後に 'celery.send_task( 'tasks.the_remote_task_name'、([arguments、...])、 queue = 'name_of_queue')'これから得たものです(https://www.marshut.net/ipwtin /sending-tasks-from-a-マシンとランニング - 陶器 - 労働者 - その他 - マシン - 他) – lukik

0

ルーティングルールを定義するいくつかの方法があります。最も一般的なものはカスタムルーターオブジェクトです。すべてのケースで、発信者はsend_taskdelayまたはapply_asyncrouting_keyパラメータを提供し、ルータはタスクを送信するキューを決定します。

+0

感謝を必要とするが、これは戻ってスタートに私をリードした場合。このルートキーはどこで定義しますか?呼び出し側のマシンに設定ファイルが必要ですか?あるいは 'send_task'を呼び出す前に設定が必要なことがありますか? – user1102018

+0

http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#id13の例は、設定ファイルを作成する方法と、設定ファイルで経路を定義する方法を示しています。ブローカはREDISなので、呼び出し側のマシンでconfigファイルが必要です。 (AMQPを使用していた場合は、代わりにRabbitレイヤーにルーティングルールを定義するオプションがあります)。 –

+0

あなたが言及した文書は、send_taskがredisを使用するように指示する方法を説明していません。作業者を設定する方法についてのみ説明しています。これを行うことで、send_taskは "Connection refused"エラーを返す(少なくとも私にとって) – AliBZ

1

リモートマシンで、broker_urlでタスクを実行するマシンを指し示すセルリーを起動します。次に、タスクを送信します(送信する特定のキューがある場合は、適切なルーティングキーを追加します)。

-2

あなたが見つけたものは正しいものでした。

from celery.execute import send_task 

send_task('tasks.add') 

任意の引数は

send_taks('tasks.add', kwargs={'a'=1, 'b'=2}) 
関連する問題