私はAPIからデータを取り出し、データベース(SQLite)に関してシステムの自動化(削除、名前変更、...)を行うタスクを持っています。 5分ごとに実行するタスクを設定しました。ただし、タスクが完了するまでに5分以上かかることがあるため、2つのタスクが並行して実行されます。 SQLiteデータベースが0分でタスクにロックされているため、これはうまくいかない。同じタスクが別のタスクで実行されないようにするにはどうすればよいですか?
どのように私はどちらか、持つことができ、
- 前のタスクが既に終了したか
- 2番目のタスクキューに入れられたアップと0分のタスクが完了した後、直接実行していない限り、タスクが実行されないのだろうか?
グローバルブールを使用して、実行中のタスクがこのように実行されないようにしようとしました。
automate_is_running = False
@periodic_task(run_every=timedelta(minutes=5))
def automate():
if not automate_is_running:
automate_is_running = True
automate_all()
automate_is_running = False
しかし、それはUnboundLocalError: local variable 'automate_is_running' referenced before assignment
エラーを返します。私は何をすべきか?
はじめに、関数内で 'global'を使う必要があります。しかし、これはあなたが望むように動作しません。なぜなら、各セロリのワーカーは独自のプロセスであり、データはプロセス間で共有されないからです。たとえば、ディスク上のファイルやdb内のエントリなど、何らかの外部ミューテックスを使用する必要があります。 –
または、一度に1つのタスクのみを実行するワーカーを1人だけ持つこともできますし、各タスクの時間制限を設定することもできます。ここの設定を参照してください:http://docs.celeryproject.org/en/latest/userguide/configuration.html –