4

我正在尝试使用 Celery 输出到多个文件。任务非常简单:

  • 获取一些数据以及文件路径
  • 将该数据附加到文件路径(如果文件不存在则创建文件)

我不想每次都打开/关闭文件句柄,因为在很多情况下我会写入同一个文件。所以我做了一个简单的 FileHandlePool。

但是,在运行时,我注意到对于每个线程/实例,celery 都会创建一个新的 FileHandlePool!所以,我有被覆盖的文件。

处理这种情况的最佳方法是什么?是否可以让 m FileHandlePool 在与主线程相同的范围内并让其他 celery 线程访问它?

谢谢!

4

2 回答 2

3

芹菜线程似乎没有共享该池。理想的方法是为单个进程分配写入文件的任务,并且所有 celery 线程都应通过队列写入该进​​程。

于 2013-01-25T06:28:54.690 回答
1

如果我不想让单独的服务(在 Celery 之外)同步到文件,我在 Celery 中完成此操作的方法是将一个工作池(并发 1 的池)绑定到仅接受文件的特定队列写任务。这种方式任务是串行运行的,并且在编写时不会有任何竞争条件。

或者,正如您最初建议的那样,您可以更改您的 CELERYD_POOL 模式以使用线程,然后将文件句柄引用存储在您的任务实例上,以便您可以从不同的工作线程访问它。我假设文件句柄是线程安全的。

于 2013-01-25T06:51:07.313 回答