我在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是否存在文件描述符。
任何克服这种行为的暗示?
答案 0 :(得分:1)
我解决了这个问题,在课堂上添加了以下内容:
def __del__(self):
self.logger.removeHandler(self.handler)
self.handler.close()
答案 1 :(得分:0)
这是因为多进程使用forks,因此__init__
中的任何内容都在父进程中运行,包括创建日志文件。
当您致电start
时,流程分叉和文件句柄在两个进程之间共享。
您应该在run
功能中设置日志记录。那你就不用担心了。