使用celery输出文件
我正在尝试使用Celery将数据输出到多个文件。这个任务其实很简单:
- 获取一些数据和一个文件路径
- 把这些数据追加到指定的文件中(如果文件不存在,就创建它)
我不想每次都打开和关闭文件,因为在很多情况下我会写入同一个文件。所以我创建了一个简单的文件句柄池(FileHandlePool)。
但是,当我运行程序时,我发现每个线程或实例都会创建一个新的文件句柄池!这样一来,我的文件就被覆盖了。
那么,处理这种情况的最佳方法是什么呢?有没有办法让多个文件句柄池在主线程的同一个范围内,并让其他Celery线程访问它?
谢谢!
2 个回答
1
如果我不想在Celery之外再搞一个单独的服务来同步文件,我可以在Celery里这样做:把一个工作池(也就是并发数为1的池)绑定到一个特定的队列,这个队列只接收写文件的任务。这样的话,任务就会一个接一个地执行,不会出现写文件时的竞争问题。
另外,正如你最开始提到的,你也可以把CELERYD_POOL的模式改成使用线程,然后在你的任务实例中存储文件句柄的引用,这样就可以在不同的工作线程中访问它。我假设这个文件句柄是线程安全的。
4
看起来这些celery线程之间并没有共享这个池。最好的办法是让一个单独的进程来负责写文件,然后所有的celery线程都通过队列把写入请求发送给这个进程。