如何关闭在Python进程中打开的FileHandler文件

时间:2018-03-13 02:25:30

标签: python python-multiprocessing

我在Python进程(multiprocessing.process)中使用记录器进行记录。我声明一个FileHandler来记录磁盘,一旦完成工作,我尝试关闭底层文件,但无法实现。我真正的问题是我产生了很多导致IOError: [Errno 24] Too many open files

的过程

我使用此代码段(test_process.py)重现错误:

import logging
import multiprocessing

class TestProcess(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        self.logger = logging.getLogger('test')
        self.logger.setLevel(logging.INFO)
        self.handler = logging.FileHandler('test.log')
        self.handler.setLevel(logging.INFO)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        self.handler.setFormatter(formatter)
        self.logger.addHandler(self.handler)

    def run(self):
        self.logger.info('hello')
        self.logger.removeHandler(self.handler)
        self.handler.close()

当我运行时:

from test_process import TestProcess
p=TestProcess()
p.start()
p.join()

您可以检查文件test.log是否存在文件描述符。

任何克服这种行为的暗示?

2 个答案:

答案 0 :(得分:1)

我解决了这个问题,在课堂上添加了以下内容:

def __del__(self):
    self.logger.removeHandler(self.handler)
    self.handler.close()

答案 1 :(得分:0)

这是因为多进程使用forks,因此__init__中的任何内容都在父进程中运行,包括创建日志文件。

当您致电start时,流程分叉和文件句柄在两个进程之间共享。

您应该在run功能中设置日志记录。那你就不用担心了。