2012-03-28 15 views
11

前回の実行が完了する前にCeleryが定期的なタスクを実行しないようにするにはどうすればよいですか?セロリのタスクを確実にする方法セロリのタスクの実行が重複しないようにする

共通のデータベースサーバーにリンクされ、Celeryタスクを実行しているサーバーのクラスタを持っていて、各サーバーが同じタスクを同時に実行することがあります。これは、痛みを伴う微妙な方法でデータを破壊している多くの競合状態を引き起こしています。

私はCelery's docsから読んできましたが、これを明示的に許可するオプションは見つかりませんでした。私はsimilar questionを見つけましたが、提案された修正はDjangoのキャッシングフレームワークに依存しているため、クラスタ内のすべてのサーバで共有されない可能性があり、複数のサーバが同じタスクを同時に実行できるようになっています。

Celeryには、データベースで現在実行中のタスクを記録するオプションはありますか?また、データベースレコードがクリアされるまで再実行しないでください。

私はジャンゴ・セロリのモジュールを使用していて、それがページ/管理/ djcelery/taskstate /と/管理/ djcelery/workerstate /を提供していても、私はどのような長期実行中のタスクまたはワーカー見決してをしましたそこに現れます。

答えて

2

私があなただったら、同時に実行できないジョブのために特別なキューをセットアップします。次に、そのキューのためだけに別のワーカーを起動することができます。

3

標準的な方法は、djangoの標準キャッシュ機構による共有ロックを使用することです。 this recipeの公式ドキュメントを参照

+0

私が言及したように、それはクラスタ設定の堅牢なメカニズムではありません...なぜデータベースを使用するオプションはありませんか? – Cerin

+0

memcachedバックエンドを使用すると、クラスタ機能が実現します –

+1

@AlexLebedev、それは良い点ですが、*クラスタ内のマシンがバックエンドを共有している場合に限ります。たとえば、memcachedをローカルで実行し、各ボックスにlocalhost memcachedバックエンドを使用することは考えられません。論理的にはっきりしていますが、誰かが「ああ、私はmemcachedを使用しています。 – mrooney

関連する問題