python multiprocessing.Pool 太多文件打开日志文件

Posted

技术标签:

【中文标题】python multiprocessing.Pool 太多文件打开日志文件【英文标题】:python multiprocessing.Pool Too many files open logging files 【发布时间】:2015-01-08 13:13:22 【问题描述】:

这是关于Too many files open with multiprocessing.Pool

我也有类似的问题。我的设置是运行这个简单脚本的四核 Ubuntu(python 2.7,pathos==0.2a1.dev,pathos 仅用于允许 mp map 与类方法一起使用)为每个进程记录一个单独的文件。

python为什么不关闭logger文件???

这里是代码...

import multiprocessing
from pathos.multiprocessing import ProcessingPool
import logging

class CreateLogger(object):
    def create_logger(self, i):
        i = str(i)
        logger = logging.getLogger(i)
        hdlr = logging.FileHandler('/tmp/test/0.log'.format(i))
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        hdlr.setFormatter(formatter)
        logger.addHandler(hdlr) 
        logger.setLevel(logging.WARNING)
        logger.info('0-test'.format(i))
        logger.propagate = 0

if __name__ == '__main__':
    cl = CreateLogger()
    ilist = range(30000)
    pool = ProcessingPool(multiprocessing.cpu_count())
    pool.map(cl.create_logger, ilist)

错误是:

pydev debugger: starting (pid: 21825)
Traceback (most recent call last):
  File "/opt/eclipse/plugins/org.python.pydev_3.8.0.201409251235/pysrc/pydevd.py", line 2183, in <module>
    globals = debugger.run(setup['file'], None, None)
  File "/opt/eclipse/plugins/org.python.pydev_3.8.0.201409251235/pysrc/pydevd.py", line 1622, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/home/amit/workspace/amit/device_polling/tests/simple_mp_test.py", line 21, in <module>
    pool.map(cl.create_logger, ilist)
  File "/miniconda/envs/test/lib/python2.7/site-packages/pathos-0.2a1.dev-py2.7.egg/pathos/multiprocessing.py", line 123, in map
    return _pool.map(star(f), zip(*args)) # chunksize
  File "/miniconda/envs/test/lib/python2.7/site-packages/processing/pool.py", line 130, in map
    return self.mapAsync(func, iterable, chunksize).get()
  File "/miniconda/envs/test/lib/python2.7/site-packages/processing/pool.py", line 373, in get
    raise self._value
IOError: [Errno 24] Too many open files: '/tmp/test/15336.log'

您可以看到打开文件过多的错误从 15336 开始。当此脚本处于调试状态时,我看到此脚本打开了 16K 文件

amit@sharknado:/tmp/test$ lsof -u amit | grep test | wc -l
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/112/gvfs
      Output information may be incomplete.
16622
amit@sharknado:/tmp/test$

【问题讨论】:

【参考方案1】:

找到我的答案...看起来,python 没有关闭日志文件。我需要手动完成。

第一,我尝试在 MyLogger 类中使用__del__ 来关闭日志文件

def __del__(self):
    if self.logger:
        for hdlr in self.logger.handlers:
            self.logger.removeHandler(hdlr)
            hdlr.flush()
            hdlr.close()

我很快意识到,这并没有被调用。我不得不手动拨打 .__del__() 并解决了问题。

学习:

    多处理没有问题;它按预期工作。

    logging 不会关闭日志文件,需要手动关闭。

【讨论】:

以上是关于python multiprocessing.Pool 太多文件打开日志文件的主要内容,如果未能解决你的问题,请参考以下文章

Python代写,Python作业代写,代写Python,代做Python

Python开发

Python,python,python

Python 介绍

Python学习之认识python

python初识