問題タブ [celeryd]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 1 台のマシン上のセロリ ワーカー間でメモリ領域を共有する
セロリのワーカーノード間で小さな情報 (キャッシュされた認証トークン、統計など) を共有したいと考えています。
タスク ファイル内にグローバルを作成すると、それはワーカーごとに一意になります (私のワーカーはプロセスであり、ライフタイムは 1 タスク/実行です)。
ベストプラクティスは何ですか? 状態を外部 (DB) に保存し、昔ながらの共有メモリを作成する必要がありますか (セロリのプール実装が異なるため難しい場合があります)。
前もって感謝します!
django - タスクを遅らせずに Celery を正常に再起動する方法
Celery を Django Web アプリケーションで使用して、オフライン タスクを管理します。これらのタスクの一部は、最大 120 秒実行できます。
コードを変更するたびに、Celery を再起動して、新しい Python コードをリロードする必要があります。私たちの現在の解決策は、メインの Celery プロセスに SIGTERM を送信し ( kill -s 15 `cat /var/run/celeryd.pid`
)、それが終了するのを待って再起動することです ( python manage.py celeryd --pidfile=/var/run/celeryd.pid [...]
)。
長時間実行されるタスクのため、これは通常、シャットダウンに 1 ~ 2 分かかることを意味します。その間、新しいタスクは処理されず、現在サイトにいるユーザーに顕著な遅延が生じます。Celery にシャットダウンを指示する方法を探していますが、すぐに新しい Celery インスタンスを起動して新しいタスクの実行を開始します。
うまくいかなかったもの:
- メイン プロセスに SIGHUP を送信する: これにより、Celery はウォーム シャットダウンを実行してから再起動することで、「再起動」を試みました。これには時間がかかるだけでなく、機能しません。古いプロセスが終了する前に新しいプロセスが起動するように見えるため、新しいプロセスは文句
ERROR: Pidfile (/var/run/celeryd.pid) already exists. Seems we're already running? (PID: 13214)
を言ってすぐに終了します。(これはセロリ自体のバグのようです。私は彼らに知らせました。) - SIGTERM をメイン プロセスに送信し、すぐに新しいインスタンスを起動する: Pidfile と同じ問題。
- Pidfile を完全に無効にする: Pidfile がないと、30 の Celery プロセスのどれが、ウォーム シャットダウンを実行するときに SIGTERM を送信する必要があるメイン プロセスであるかを知る方法がありません。また、メイン プロセスがまだ生きているかどうかを確認する信頼できる方法もありません。
django - セロリ労働者を優雅に再開するにはどうすればよいですか?
ワーカーのコードを更新するために新しいビルドを発行しているときに、セロリワーカーを正常に再起動するにはどうすればよいですか?
編集: 私がやろうとしていることは、このようなことです。
- ワーカーが実行されており、おそらく100MBのファイルをS3にアップロードしています
- 新しいビルドが来る
- ワーカーコードに変更があります
- ビルドスクリプトは、ワーカーにシグナルを送信します
- 新しいコードで新しいワーカーを開始します
- 既存のジョブ終了を終了した後にシグナルを受け取ったワーカー。
python - ピラミッドとmod_wsgiでセロリを使用する
pserveでpyramidを使用し、pcelerydを実行することで、テストアプリケーションをデプロイすることができました(送信中にブロックせずにメールを送信するだけです)。
しかし、私が理解していない点が1つあります。mod_wsgiを使用してアプリケーションを実行したいのですが、シェルからpcelerydを実行せずに実行できるかどうかはわかりませんが、仮想ホストで何かを実行できるかどうかはわかりません。構成。
出来ますか?どのように?
django - Django Celeryd での TransactionManagementError / sqlite バックエンドでの django-celery
バックグラウンドでジョブを実行する小さなアプリに Django を使用します (主に cron スタイルですが、ユーザーが開始するものもあります)。
免責事項:これはcelerydとの最初の出会いです。これまでのセットアップはドキュメントと例からです
私は Django 1.3、celeryd 2.5、django-celery 2.5.1、および sqlite3 を使用しています。
私はまだテスト段階にあるので、実際のタスクを呼び出すのではなく、メッセージを出力するだけです。
私はcronスタイルのタスクを持っています:
そして、ユーザーが開始する別のタスク:
cron スタイルのタスクは 1 日に 1 回だけ実行され、もう 1 つのタスクは控えめに実行されます
(1 日あたり平均 0 回から 30 回程度)。
バックエンドとして sqlite を使用しており、セロリの設定は次のとおりです。
私が遭遇している問題は、発生するはずはありませんが、発生する可能性があるため、ユーザーが開始したタスクuser_task
が立て続けに数回呼び出された場合、セロリは次のようにシャットダウンします。
Unrecoverable error: TransactionManagementError('Transaction managed block ended with pending COMMIT/ROLLBACK',)
さらに下のスタック
TransactionManagementError("Transaction managed block ended with "
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK
celerd docsによると、django-celery w/sqlite を使用すると、一度に 1 つのタスクしか処理できません。これは私の場合には最適ですが、複数のタスクが互いに重なっているようです。
同時実行レベルを 1 に設定し、プール制限を [なし] に設定して解決しようとしましたが、それでも同じエラーが発生します。
ここでセロリに何か欠けていますか?何か間違ったことをしていますか?私が達成しようとしていることに対するより良いアプローチはありますか?
python - 複数の celeryd プロセスで取り消されたタスクを追跡する方法
「eta」引数を使用してセロリでタスクをスケジュールするリマインダー タイプのアプリがあります。リマインダー オブジェクトのパラメーターが変更された場合 (リマインダーの時刻など)、以前に送信されたタスクを取り消し、新しいタスクをキューに入れます。
celeryd の再起動時に取り消されたタスクを追跡する良い方法があるかどうか疑問に思っていました。その場で celeryd プロセスをスケールアップ/ダウンできるようにしたいのですが、revoke コマンドが送信された後に開始された celeryd プロセスは引き続きそのタスクを実行するようです。
これを行う 1 つの方法は、取り消されたタスク ID のリストを保持することですが、この方法ではリストが勝手に大きくなります。このリストを整理するには、タスクがもう RabbitMQ キューにないことを保証する必要がありますが、これは不可能のようです。
また、各 celeryd ワーカーに共有 --statedb ファイルを使用してみましたが、stateb ファイルはワーカーの終了時にのみ更新されるため、達成したいことには適していないようです。
前もって感謝します!
celery - 複数の負荷分散された Django アプリケーション サーバーで Celery を使用することに関する質問
私が取り組んでいるアプリに Celery を使用することに興味があります。すべてが単純明快に思えますが、負荷分散された複数のアプリケーション サーバーを使用している場合に何をする必要があるかについて、少し混乱しています。すべてのドキュメントは、ブローカーがアプリケーションと同じサーバー上にあることを前提としています。現在、私のアプリケーション サーバーはすべて Amazon ELB の背後にあり、タスクはそれらのいずれかから取得できる必要があります。
これは私がする必要があると私が仮定するものです:
- 別のインスタンスでブローカー サーバーを実行する
- そのブローカー サーバーに接続するように各アプリケーション インスタンスを構成する
- 各アプリケーション インスタンスもセロリの動作 (celeryd の実行) になりますか?
私の唯一の不満は、ブローカ インスタンスが停止した場合はどうなるかということです。2 つのブローカー インスタンスを実行して、1 つがダウンしても安全な方法はありますか?
私のようなセットアップで何をすべきかについてのヒントや情報は大歓迎です. 私は何かが欠けているか、何かを理解していないと確信しています。
daemon - 複数のdjangoアプリでデーモンとしてcelerydを使用していますか?
django-celeryを使い始めたばかりで、celeryd をデーモンとして実行したいと考えています。ただし、手順は、一度に 1 つのサイト/プロジェクトに対してのみ構成できることを示唆しているようです。celeryd は複数のプロジェクトを処理できますか、それとも 1 つだけを処理できますか? また、この場合、構成ごとに celeryd を自動的に開始するようにセットアップするクリーンな方法はありますか?
django-celery - Celerybeat が起動直後にシャットダウンする
celeryd と celerybeat を使用している django アプリがあります。どちらもデーモンとして実行するように設定されています。celerybeat が正しく起動しないため、celerybeat タスクは実行されません。ログによると、すぐにシャットダウンします。
/etc/int.d/celerybeat start で開始しています
これは /etc/default/celerybeat の設定です:
タスク スケジュールは settings.py で設定されます。
./manage.py celerybeat を使用してシェルから celerybeat を実行すると、正常に動作するようです。
celeryd config には celerybeat セクションもありますが、無視されていると思います。
よろしくサイモン
django - CelerydWorkerはタスクの処理を停止します
私は2人の労働者と一緒に走っているセロリを持っていて、彼らを見ると、彼らがそれぞれ4つのタスクを受け入れ、それらを処理してから、タスクの処理を停止しているのがわかります。(これらのタスクは長時間実行され、処理に最大2分かかることに注意してください)。
celeryctlは、次の情報を提供します。
さらに、これが発生するたびに、ログに出力される最後のものは次のとおりです。
これが出力される直前にタスクも失敗しました。私のコードでは、呼び出したのは次のとおりです。
celerydを殺して(^ C、すぐに死んで、タスクを待たずに)再開すると、さらにいくつかのタスクで何も起こらなかったように続行し、再び死にます(常にcreate_pdf
タスクにあると思いますが、ログには次のように表示されます)このタスクは失敗し、問題なく再試行されます)