私はセロリに取り組んでおり、rabbitmqサーバーを使用して、Djangoプロジェクトがサーバー(メッセージキュー、データベースが存在する場所)にプロジェクトを作成し、それが正常に機能しています。複数のワーカーも作成しました)
from kombu import Exchange, Queue
CELERY_CONCURRENCY = 8
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
CELERY_RESULT_BACKEND = 'amqp'
CELERYD_Hijack_ROOT_LOGGER = True
CELERY_Hijack_ROOT_LOGGER = True
BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),
Queue('q1', Exchange('A'), routing_key='routingKey1'),
Queue('q2', Exchange('B'), routing_key='routingKey2'),
)
CELERY_ROUTES = {
'my_taskA': {'queue': 'q1', 'routing_key': 'routingKey1'},
'my_taskB': {'queue': 'q2', 'routing_key': 'routingKey2'},
}
AMQP_SERVER = "127.0.0.1"
AMQP_PORT = 5672
AMQP_USER = "guest"
AMQP_PASSWORD = "guest"
AMQP_VHOST = "/"`
CELERY_INCLUDE = ('functions')
`
しかし、私は別のサーバーからワーカーを実行したいので、Djangoプロジェクトを実行する必要があると言っているいくつかのサイトを参照したときに、別のシステムでワーカーを実行する方法に関する情報が必要ですリモートシステムも必要ですか?
アイデアの要点は次のとおりです。
マシンAの場合:
マシンBの場合:
同じ要件があり、セロリで実験しました。それを行う方がはるかに簡単です。その数日前に詳細なブログ投稿を書きました。チェックアウト タスクをリモートマシンに送信する方法
Djangoプロジェクトで次のようなものを使用して app.send_task()
を利用できます:
from celery import Celery
import my_client_config_module
app = Celery()
app.config_from_object(my_client_config_module)
app.send_task('dotted.path.to.function.on.remote.server.relative.to.worker',
args=(1, 2))
まず、セロリが実際にどのように機能するかについて考えますか?
Celeryプロデューサーは、名前とその他の重要なヘッダーを含むタスクをキューに追加し、タスクの場所を識別します。
Celeryは完全な実行可能関数をMQに追加しません。
だから、労働者(消費者)側を見ると.
CeleryはMQからタスクの詳細を取得し、これを実行しようとします。このタスクを実行するには、このタスクを実行するための利用可能なモジュール/ファイル/環境/コードベースが必要です。
今あなたの質問に来ましょう...
ワーカーを別のマシンに設定して、タスクが指す関数を実行するように論理的に実行しようとすると、タスクの完全なコード環境が必要であり、そうでない場合は、タスクが存在するMQに接続します(それ以外の場合は、MQからタスクを取得する方法を教えてください)。
基本的に私はChillarAnandの答えを取ります。私は彼の答えにコメントを追加したいと思いますが、私は50の評判がないわけではありません。
そう...
あなたの質問への答え...
ChillarAnand で述べたように、最初に "タスクをリモートマシンに送信する方法?" を読みます。
「remote.pyのコンテンツdef add()に '@ app.task'がない」などの小さな欠陥があるため、問題が発生し、セロリの初心者として混乱しました。 。
"[Errno 113]ホストへのルートがありません。"部分への回答、
たぶん... rabbitmqサーバーでファイアウォールが実行されていると思います。チェックすることをお勧めします。ほとんどの場合、それはiptablesですが、それ以外の可能性もあります。オフにするか、ルールを変更します。その後、もう一度試すことができます。