迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 多处理日志记录

作者:迹忆客 最近更新:2023/06/13 浏览次数:

本文将讨论 multiprocessing 的概念。 在此之后,我们将讨论 Python 中的多处理和使用 Python 代码进行多处理的日志处理。


多重处理

多处理是一种计算范例,其中多个处理器同时处理同一程序的不同部分。

在多进程操作系统中运行的应用程序被分成更小的子程序,通过分配到不同的处理器中独立运行以提高性能。

多重处理有两种不同的类型:

  1. 对称多处理:在这种多处理技术中,单个操作系统管理多个具有共享主内存的计算机处理器。 通常,具有多处理能力的计算机系统支持对称多处理。
  2. 非对称多处理:在这种多处理中,分配一个计算机处理器来处理与操作系统相关的任务,而另一个计算机处理器则分配与应用程序相关的任务。 与对称多处理相比,它被认为是低效的,因为在非对称多处理中,一个处理器可能空闲,而另一个处理器可能在同一时间间隔内完全忙碌。

Python 中的多处理

在 Python 中,多处理库用于多处理任务。

考虑以下示例:

import multiprocessing
def func1(arg):
    print("func1: with parameter",arg)
def func2(arg):
    print("func2: with parameter",arg)


if __name__ == "__main__":
    process1 = multiprocessing.Process(target=func1, args=(1,))
    process2 = multiprocessing.Process(target=func2, args=(2,))

    process1.start()
    process2.start()

    process1.join()
    process2.join()
    print("Processes Ended")

在上面的代码中,我们使用 import multiprocessing 来包含 multiprocessing 模块。 Process 类对象用于创建进程。

进程类对象接收目标(在进程中运行的函数)作为参数和 args 作为目标函数的参数。

Process 类的启动方法用于启动进程。 在上面的例子中,我们启动了两个进程。

我们使用 join 方法继续执行当前程序,直到 process1 和 process2 没有终止。

一旦 process1 和 process2 完成它们的任务,当前程序运行 print("Processes Ended") 语句。

上述程序的输出如下:

func1: with parameter 1
func2: with parameter 2
Processes Ended

多处理期间 Python 中的进程 ID

我们还可以使用两种不同的方法打印进程 ID (PID)。

  1. os.getpid()
  2. 进程类对象成员变量pid

考虑以下代码:

import multiprocessing
import os

def func1(arg):
    print("func1: with parameter ",arg)
    print("ID of func1 process:", os.getpid())
def func2(arg):
    print("func2: with parameter ",arg)
    print("ID of func2 process:", os.getpid())


if __name__ == "__main__":
    process1 = multiprocessing.Process(target=func1, args=(1,))
    process2 = multiprocessing.Process(target=func2, args=(2,))

    process1.start()
    process2.start()

    print ("Process 1 / function 1 PID: ",process1.pid)
    print("Process 2 / function 2 PID: ", process2.pid)
    process1.join()
    process2.join()
    print("Processes Ended")

在上面的示例中,os.getpid() 和 process1.pid 显示了进程 ID。 以下代码的输出如下:

Process 1 / function 1 PID:  11368
Process 2 / function 2 PID:  14876
func1: with parameter  1
ID of func1 process: 11368
func2: with parameter  2
ID of func2 process: 14876
Processes Ended

os.getpid() 和 process1.pid 显示相同的进程 ID。


Pool 类的多处理

Python 多处理模块的 Pool 类用于并行执行具有不同输入值的相同函数。 例如,考虑以下代码:

import multiprocessing

def func1(arg):
    print("func1: with parameter ",arg)


if __name__ == '__main__':
    process_pool = multiprocessing.Pool(3)
    process_pool.map(func1, [1,2,3])
    process_pool.close()
    process_pool.join()
In the above code, multiprocessing.Pool creates three processes to call func1 with different arguments. The output of the following code is as follows:

func1: with parameter  1
func1: with parameter  2
func1: with parameter  3

Python 中的多处理日志记录

我们可以使用 Python 的多进程库记录来自多个进程的信息。 记录多处理有不同的方法。

我们可以使用 Python 中的 logging.handlers、QueueHandler 和 QueueListener 类来进行日志记录。

考虑以下代码:

import multiprocessing
import logging
import os
from logging.handlers import QueueHandler, QueueListener

def func(arg):
    logging.info('Process/function with argument {} and PID {}'.format(arg, os.getpid()))

def Process_init(q):
    queue_handler = QueueHandler(q)
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    logger.addHandler(queue_handler)

if __name__ == '__main__':
    print ('Main Started')
    mp_queue = multiprocessing.Queue()
    lg_handler = logging.StreamHandler()

    lg_handler.setFormatter(logging.Formatter("%(levelname)s: %(asctime)s - %(process)s - %(message)s"))

    queue_listener = QueueListener(mp_queue, lg_handler)
    queue_listener.start()

    process_pool = multiprocessing.Pool(2, Process_init, [mp_queue])
    process_pool.map(func, [1, 2])
    process_pool.close()
    process_pool.join()

    queue_listener.stop()
    print ('Main Ended')

上面的代码定义了一个接受一个参数的函数 func。

func 方法记录一个具有参数值和进程 ID 的字符串。 我们使用 os.getpid() 获取进程 ID。

在 main 方法中,我们为 QueueListener 创建 multiprocessing.Queue()logging.StreamHandler() 对象。 handler.setFormatter 用于设置日志格式。

我们使用 multiprocessing.Pool 对象创建两个进程,并以 1 和 2 作为参数值在两个进程中调用 func 方法。

Process_init 方法用于初始化queue_handler。 上述代码的输出如下:

多处理日志记录的输出

上面的代码显示了进程 ID 为 7024 和 15680 的两个进程的日志信息。

我们还可以通过将 lg_handler = logging.StreamHandler() 语句替换为 lg_handler = logging.FileHandler('info.log') 来将信息记录到日志文件中。

logging.FileHandler 创建文件 info.log 并将日志存储在 info.log 文件中。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:https://www.jiyik.com/tm/xwzj/prolan_6665.html

相关文章

限制 Java SSL 调试日志记录

发布时间:2023/07/21 浏览次数:228 分类:Java

通过本文我们将了解 Java SSL 调试、其重要性、各种实用程序以及如何在单个命令中使用一个或多个实用程序。Java SSL 调试及其重要性

Python 日志记录传播

发布时间:2023/06/14 浏览次数:179 分类:Python

本文介绍了 LevelFilter 的使用,以显示如何将特定级别及更高级别(例如,INFO 及更高级别)的特定记录器名称的消息记录到特定的日志处理程序。Python 日志记录传播

Python 全局日志记录器

发布时间:2023/06/14 浏览次数:202 分类:Python

本文介绍 Python 中的日志记录模块。 它还介绍了日志记录级别及其重要性,从而生成了一个代码示例,演示了 Python 日志记录模块的全局使用。

Python multiprocessing 共享对象

发布时间:2023/06/13 浏览次数:130 分类:Python

在 Python 中,共享内存多处理由连接多个处理器组成,但这些处理器必须能够直接访问系统的主内存。 这将允许所有连接的处理器访问它们使用或创建的其他处理器数据。

NodeJS 中的日志记录

发布时间:2023/03/12 浏览次数:288 分类:Node.js

本教程演示如何在 NodeJS 中创建和存储日志,Logging 是记录应用程序流程和行为的过程。Logging 应该在生产模式下执行到更持久的输出流。

SLF4J 参数化日志记录

发布时间:2022/06/04 浏览次数:193 分类:教程更新

正如本教程前面所讨论的,SLF4J 提供了对参数化日志消息的支持。 我们可以在消息中使用参数并稍后在同一语句中将值传递给它们。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便