2012-04-19 8 views
17

私はちょうどdjango-celeryを使用し始めています。私はデーモンとしてceleryd runningを設定したいと思います。しかし、instructionsは、一度に1つのサイト/プロジェクトに対してのみ設定できることを示唆しています。 celerydは複数のプロジェクトを処理できますか、それとも1つしか処理できませんか?この場合、各設定に対して自動的に起動するようにcelerydを設定するクリーンな方法があります。そのため、それぞれに個別のinitスクリプトを作成する必要があります。複数のdjangoアプリケーションでデーモンとしてcelerydを使用していますか?

答えて

8

すべての興味深い質問と同様に、答えはです。それはに依存します。 :)

2つの独立したサイトでcelerydを使用できるシナリオを考え出すことは間違いありません。複数のサイトが同じエクスチェンジにタスクを提出していて、タスクが特定のデータベースへのアクセスを必要としない - たとえば、電子メールアドレスやクレジットカード番号、またはデータベースレコード以外のもので動作している場合 - 十分である。タスクコードがすべてのサイトとセロリサーバーによって読み込まれる共有モジュールにあることを確認してください。

通常、セカリはデータベースにアクセスする必要があります。セマンティクスは、タスクパラメータとして渡されたIDに基づいてオブジェクトをロードするか、データベースに変更を書き込むか、最も頻繁に、両方。また、複数のサイトやプロジェクトでは、同じアプリを共有していてもデータベースを共有しないので、タスクキューを別にする必要があります。

この場合、通常は、複数のエクスチェンジを持つ単一のメッセージブローカー(たとえばRabbitMQ)を設定することがあります。各交換局は、単一のサイトからメッセージを受信します。次に、各交換のどこかで1つまたは複数のcelerydプロセスを実行します(セロリの設定では、交換を指定する必要があります。私はcelerydが複数の交換を聞くことはできません)。各celerydサーバーは交換、それをロードする必要のあるアプリケーション、および接続先のデータベースを認識しています。

これを管理するには、cymeを調べてみることをお勧めします。@asksolによって作成され、必要に応じて複数のサーバーで複数のcelerydインスタンスを管理します。私は試していませんが、異なるインスタンスに対して異なる設定を処理する必要があるようです。

1

は試みるが、ジャンゴ・セロリを必要としないセロリの3.1.xを使用して、あなたはこのようなセロリアプリをインスタンス化することができますマニュアルに従っていない:

app1 = Celery('app1') 

app1.config_from_object('django.conf:settings') 
app1.autodiscover_tasks(lambda: settings.INSTALLED_APPS) 


@app.task(bind=True) 
def debug_task(self): 
    print('Request: {0!r}'.format(self.request)) 

しかし、あなたは、いくつかを起動するためのセロリのマルチを使用することができます単一の構成を持つ労働者の場合は、例hereが表示されます。

# 3 workers: Two with 3 processes, and one with 10 processes. 
$ celery multi start 3 -c 3 -c:1 10 
celery worker -n [email protected] -c 10 --config celery1.py --app app1 
celery worker -n [email protected] -c 3 --config celery2.py --app app2 
celery worker -n [email protected] -c 3 --config celery3.py --app app3 
:それは違うtaksと設定を使用しますので、ですから、異なる --app APPXパラメータを使用して、いくつかの労働者を起動することができます
関連する問題