4

Celeryを使用して複数のファイルに出力しようとしています。タスクは非常に簡単です。

  • ファイルパスと一緒にいくつかのデータを取得します
  • そのデータをファイルパスに追加します(ファイルが存在しない場合はファイルを作成します)

多くの場合同じファイルに書き込むので、毎回ファイルハンドルを開いたり閉じたりしたくありません。そこで、単純なFileHandlePoolを作成しました。

ただし、実行すると、スレッド/インスタンスごとに、セロリが新しいFileHandlePoolを作成することに気付きました。だから、私は上書きされているファイルを持っています。

この状況に対処するための最良の方法は何ですか?m FileHandlePoolをメインスレッドと同じスコープに配置し、他のセロリスレッドにアクセスさせることは可能ですか?

ありがとう!

4

2 に答える 2

3

プールは、セロリ スレッドによって共有されていないようです。これを行う理想的な方法は、単一のプロセスにファイルへの書き込みタスクを割り当て、すべてのセロリスレッドがキューを介してそのプロセスに書き込む必要があることです。

于 2013-01-25T06:28:54.690 に答える
1

別のサービス (Celery の外部) をファイルに同期させたくない場合、Celery でこれを実現する方法は、ファイルのみを受け入れる特定のキューに 1 つのワーカー プール (同時実行数 1 のプール) をバインドすることです。タスクを書きます。この方法では、タスクが連続して実行され、書き込み中に競合状態が発生することはありません。

または、最初に提案したように、CELERYD_POOLモードを変更してスレッドを使用し、ファイルハンドル参照をタスクインスタンスに保存して、さまざまなワーカースレッドからアクセスできるようにすることもできます。その場合、ファイルハンドルはスレッドセーフであると想定しています。

于 2013-01-25T06:51:07.313 に答える