0

「to do」リストの最初の 50 項目を通過し、各項目でスクリプトを実行し、データベースで実行済みとしてマークする cron ジョブを数分ごとに実行しています。

これは、アイテムを完了としてマークするテーブルが何かによってロックされ、アイテムがマークされなくなるまではうまく機能していました。その後、cron が再び実行され、同じ 50 項目が処理されました。

これは、mysql のプロセス リストが大量になり、数分ごとに 50 ずつ大きくなるまで繰り返されました。

どうすればこの出来事を止めることができますか? 私の考えは次のとおりです。

  • スクリプトにコードを追加して、再度実行する前に cron がまだ実行されているかどうかを確認します
  • 新しい SELECT クエリを実行して次の 50 項目を取得する前に、mysql テーブルでロックされたテーブルを確認します。

どちらにも浮き沈みがあるようで、適切に実装する方法がわかりません。誰にもアドバイス/より良いアイデアはありますか?

4

1 に答える 1

1

いくつかの方法があります。

  1. テーブルを変更して、ステータスを追跡します。例: ToDo、開始済み、完了。そして「ToDo」だけを処理します。また、タスクを開始済みとしてマークできるまで、タスクを開始しないでください。cron ジョブが失敗した場合にタスクを再開する方法を作成する必要があります。

  2. タスクを完了としてマークできない場合は、トランザクションを使用してタスクの内容をロールバックします。

  3. cron ジョブの実行を同期して、一度に 1 つのみ実行できるようにします。これを行うには、ファイルをロックできます。最初にファイルを確認し、ロックを取得できない場合は終了します。

  4. 定期的に実行するのではなく、スリープ状態で cron ジョブを永久に実行します。

于 2013-03-20T17:41:44.990 に答える