gpt4 book ai didi

python 多处理日志记录 : QueueHandler with RotatingFileHandler "file being used by another process" error

转载 作者:太空宇宙 更新时间:2023-11-04 08:54:02 24 4
gpt4 key购买 nike

我正在将一个程序转换为多进程,并且需要能够从主进程和子进程记录到单个循环日志。我正在尝试使用 python 食谱中的第二个示例 Logging to a single file from multiple processes ,它启动一个 logger_thread 作为主进程的一部分运行,从子进程添加到的队列中获取日志消息。该示例按原样运行良好,如果我切换到 RotatingFileHandler 也可以运行。

但是,如果我将其更改为在子进程之前启动 logger_thread(这样我也可以从主进程记录日志),那么一旦日志轮换,所有后续日志记录都会生成一个回溯WindowsError: [Error 32] 该进程无法访问该文件,因为它正被另一个进程使用

换句话说,我更改了第二个示例中的代码

workers = []
for i in range(5):
wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))
workers.append(wp)
wp.start()
logging.config.dictConfig(d)
lp = threading.Thread(target=logger_thread, args=(q,))
lp.start()

为此:

logging.config.dictConfig(d)
lp = threading.Thread(target=logger_thread, args=(q,))
lp.start()
workers = []
for i in range(5):
wp = Process(target=worker_process, name='worker %d' % (i + 1), args=(q,))
workers.append(wp)
wp.start()

并将 logging.FileHandler 换成 logging.handlers.RotatingFileHandler(使用非常小的 maxBytes 进行测试)然后我点击了这个错误。

我使用的是 Windows 和 python 2.7。 QueueHandler 在 python 3.2 之前不是标准库的一部分,但我已经从 Gist 复制了源代码,它说这样做是安全的。

我不明白为什么首先启动监听器会有任何不同,我也不明白为什么除 main 之外的任何进程都会尝试访问该文件。

最佳答案

你不应该在子进程之前启动任何线程。当 Python fork 时,线程和 IPC 状态不会总是被正确复制。

关于这方面的资源有很多,只需谷歌搜索 fork 和 threads。有些人声称他们可以做到,但我不清楚它是否可以正常工作。

只需先启动所有流程即可。

示例附加信息:

Status of mixing multiprocessing and threading in Python

https://stackoverflow.com/a/6079669/4279

在您的情况下,复制的打开文件句柄可能是问题所在,但您仍然应该在线程之前启动子进程(并且在您打开任何稍后要销毁的文件之前)。

一些经验法则,由 fantabolous 从评论中总结:

  • 子进程必须始终在同一进程创建的任何线程之前启动。

  • multiprocessing.Pool 创建子进程和线程,因此不得在第一个进程或池之后创建其他进程或池。

  • 创建进程或池时,文件不应已打开。 (这在某些情况下是可以的,但不是,例如,如果稍后将删除文件。)

  • 子进程可以创建自己的线程和进程,并应用上述相同的规则。

  • 首先启动所有进程是最简单的方法

关于python 多处理日志记录 : QueueHandler with RotatingFileHandler "file being used by another process" error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32099378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com