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

查看:145
本文介绍了python - 【多进程日志回滚失败】subprocess,子进程拷贝了主进程的文件描述符,导致主进程回滚日志失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

  1. 问题描述

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

  2. 代码环境以及原因分析

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

  3. 谷歌了很多方案,解决失败

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

解决方案

自己来解答以下,使用了一种方法,在主进程和子进程启动时关闭对方的日志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参数却没有生效

这篇关于python - 【多进程日志回滚失败】subprocess,子进程拷贝了主进程的文件描述符,导致主进程回滚日志失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆