多进程打印日志

多进程的日志和多线程的日志有一点区别。缘由是 Python 的 logging 包不支持进程共享锁,因此来自不一样的进程的日志可能会混在一块儿。咱们尝试一下在上边的例子里加一个基础日志。下边是代码:html

import loggingimport multiprocessingfrom multiprocessing import Process, Lockdef printer(item, lock):
    """    Prints out the item that was passed in    """
    lock.acquire()
    try:
        print(item)
    finally:
        lock.release()if __name__ == '__main__':
    lock = Lock()
    items = ['tango', 'foxtrot', 10]
    multiprocessing.log_to_stderr()
    logger = multiprocessing.get_logger()
    logger.setLevel(logging.INFO)
    for item in items:
        p = Process(target=printer, args=(item, lock))
        p.start()

记录日志最简单的方法是将全部的日志发送给 stderr 。咱们能够经过调用函数 log_to_stderr 来实现。而后咱们调用 get_logger 函数获得记录器(logger),并把日志级别设置为 INFO。剩下的代码和原来同样。这里要说明一下,我并无用 join() 函数。相反, 父线程在退出的时候要显式地调用 join()python

当你运行上边的代码,会获得像下面这样的输出:多线程

[INFO/Process-1] child process calling self.run()
tango
[INFO/Process-1] process shutting down
[INFO/Process-1] process exiting with exitcode 0
[INFO/Process-2] child process calling self.run()
[INFO/MainProcess] process shutting down
foxtrot
[INFO/Process-2] process shutting down
[INFO/Process-3] child process calling self.run()
[INFO/Process-2] process exiting with exitcode 0
10
[INFO/MainProcess] calling join() for process Process-3
[INFO/Process-3] process shutting down
[INFO/Process-3] process exiting with exitcode 0
[INFO/MainProcess] calling join() for process Process-2

如今你若是想把日志保存到硬盘,其实还有有些复杂的。你能够参考 Python 的官方实例ide

相关文章
相关标签/搜索