2012-08-17 13 views
14

私は多少このように、タスクを持っている:いつでもセロリ

@task() 
def async_work(info): 
    ... 

、私はいくつかの情報をasync_work呼び出すことができます。何らかの理由で、一度に1つのasync_workだけが実行されていることを確認し、他の呼び出し要求が待機していることを確認する必要があります。

だから私は、次のコードを思い付く:それを解決する方法 ...

is_locked = False  
@task() 
    def async_work(info): 
     while is_locked: 
      pass 
     is_locked = True 
     ... 
     is_locked = False 

しかし、それはローカル変数にアクセスするには、無効だと言いますか?

+0

正確なエラーメッセージを投稿できますか? –

答えて

21

タスクを実行している複数のセロリの作業者がいる可能性があるため、ローカル変数にアクセスすることはできません。そして、それらの労働者は異なるホストにいるかもしれません。したがって、基本的には、個の変数インスタンスがあり、多くのCeleryワーカーが async_workタスクを実行しています。したがって、たとえあなたのコードがエラーを発生させないとしても、あなたが望む効果を得ることはできません。

目的を達成するには、1人のワーカーのみを実行するようにセロリを設定する必要があります。一人の作業者は一度に1つのタスクを処理できるので、必要なものを手に入れることができます。

EDIT:Workers Guide > Concurrencyによると

デフォルトのマルチプロセッシングによっては タスクの同時実行を実行するために使用されていますが、Eventletを使用することができます。 worker プロセス数/スレッド数は、--concurrency引数 を使用して変更でき、デフォルトはマシン上で使用可能なCPUの数になります。

$ celery worker --concurrency=1 

EDIT 2:

は、驚くべきことに、別の解決策があります、しかもそれも公式ドキュメントであり、Ensuring a task is only executed one at a timeの記事を参照してください、あなたはこのように労働者を実行する必要がありますこのように

+0

もっと明示的に説明できますか? 1人のワーカーのみを実行するようにセロリを設定するには? –

+0

"$ celery worker --concurrency = 1"うまくいきました!確かにありがとう。 –

関連する問題