【多进程日志回滚失败】subprocess,子进程拷贝了主进程的文件描述符,导致主进程回滚日志失败

发布于 2022-09-03 09:46:26 字数 609 浏览 31 评论 0

  1. 问题描述

    主进程使用subprocess启动一个进程, 主进程的文件描述符同样拷贝到了子进程,subprocess带的close_fds参数已经设置为True, 没有效果,这样导致了主进程就没办法重命名这个文件描述符了,因此引起了下面的问题:
  2. 代码环境以及原因分析

    多进程日志回滚失败,报Error 32错误:
        系统环境:windows10 python。
        代码逻辑:主进程和子进程都是使用logging模块的时间回滚handler,
                 主进程使用subprocess启动子进程,主进程和子进程使用不同的文件名记录日志并回滚
        大致原因:主进程启动子进程后,主进程的日志文件描述符被子进程占用,主进程切割不了,
                 所以一直报Error 32。subprocess的close_fds设置为True貌似没有效果,仍然报错
                 
  3. 谷歌了很多方案,解决失败

    没有一个说明子进程占用父进程的日志文件描述符如何回滚的解决办法,
    基本都是多进程写一个日志文件的问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你的背包 2022-09-10 09:46:26

自己来解答以下,使用了一种方法,在主进程和子进程启动时关闭对方的日志handler:

log = logging.getLogger(config.CTRL_LOGGER_NAME)
for handler in log.handlers:
    handler.flush()
    handler.close()
    log.removeHandler(handler)

这个问题可能是subprocess的bug引起,subprocess提供了close_fds参数却没有生效

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文