Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用芹菜输出到文件_Python_Multithreading_Celery - Fatal编程技术网

Python 使用芹菜输出到文件

Python 使用芹菜输出到文件,python,multithreading,celery,Python,Multithreading,Celery,我正在尝试使用芹菜输出到多个文件。任务非常简单: 获取一些数据和文件路径 将该数据附加到文件路径(如果文件不存在,则创建该文件) 我不想每次都打开/关闭文件句柄,因为在许多情况下我会写入同一个文件。所以我做了一个简单的FileHandlePool 然而,当运行时,我注意到对于每个线程/实例,芹菜将生成一个新的FileHandlePool!所以,我有被覆盖的文件 处理这种情况的最佳方法是什么?是否可以让m FileHandlePool与主线程在同一范围内,并让其他芹菜线程访问它 谢谢 这个池似

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

  • 获取一些数据和文件路径
  • 将该数据附加到文件路径(如果文件不存在,则创建该文件)
我不想每次都打开/关闭文件句柄,因为在许多情况下我会写入同一个文件。所以我做了一个简单的FileHandlePool

然而,当运行时,我注意到对于每个线程/实例,芹菜将生成一个新的FileHandlePool!所以,我有被覆盖的文件

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


谢谢

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

如果我不想让一个单独的服务(芹菜之外)同步到文件,我在芹菜中实现这一点的方法是将一个工作池(并发性为1的池)绑定到只接受文件写入任务的特定队列。这样,任务可以连续运行,并且在编写时不会出现任何竞争条件


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

这正是我想要做的。我想我在问题中没有很好地描述它。所以我怎么做呢?我一直在参考教程,你是在线程模式下运行芹菜还是作为单独的进程运行芹菜?我想是线程模式。我正在使用芹菜教程中的基本设置。芹菜默认在工作池中使用单独的进程。您可以使用CELERYD_池配置参数对此进行扩充。请给出一个简短的示例,说明如何将CELERYD_池更改为?