Python 多处理日志记录
本文将讨论 multiprocessing 的概念。 在此之后,我们将讨论 Python 中的多处理和使用 Python 代码进行多处理的日志处理。
多重处理
多处理是一种计算范例,其中多个处理器同时处理同一程序的不同部分。
在多进程操作系统中运行的应用程序被分成更小的子程序,通过分配到不同的处理器中独立运行以提高性能。
多重处理有两种不同的类型:
- 对称多处理:在这种多处理技术中,单个操作系统管理多个具有共享主内存的计算机处理器。 通常,具有多处理能力的计算机系统支持对称多处理。
- 非对称多处理:在这种多处理中,分配一个计算机处理器来处理与操作系统相关的任务,而另一个计算机处理器则分配与应用程序相关的任务。 与对称多处理相比,它被认为是低效的,因为在非对称多处理中,一个处理器可能空闲,而另一个处理器可能在同一时间间隔内完全忙碌。
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)。
- os.getpid()
- 进程类对象成员变量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 进行申请,经作者同意之后,转载请以链接形式注明出处
相关文章
限制 Java SSL 调试日志记录
发布时间:2023/07/21 浏览次数:228 分类:Java
-
通过本文我们将了解 Java SSL 调试、其重要性、各种实用程序以及如何在单个命令中使用一个或多个实用程序。Java SSL 调试及其重要性
在 Python 中的日志记录库的帮助下使用 Log4j
发布时间:2023/06/14 浏览次数:150 分类:Python
-
本文解释了 log4j、它的工作原理及其使用重要性。 我们还将探索如何在日志库的帮助下在 Python 编程语言中使用 log4j。
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 提供了对参数化日志消息的支持。 我们可以在消息中使用参数并稍后在同一语句中将值传递给它们。