gpt4 book ai didi

Python:如何为 multiprocessing.Pool 中的进程使用不同的日志文件?

转载 作者:行者123 更新时间:2023-12-05 03:23:57 24 4
gpt4 key购买 nike

我正在使用 multiprocessing.Pool 并行运行多个独立进程。与 python 文档中的基本示例没有太大区别:

from multiprocessing import Pool

def f(x):
return x*x

if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))

我希望每个进程都有一个单独的日志文件。我在我的代码库和一些第三方包中记录来自其他模块的各种信息(它们都不是多处理感知的)。所以,例如,我想要这样:

import logging
from multiprocessing import Pool

def f(x):
logging.info(f"x*x={x*x}")
return x*x

if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, range(10)))

写入磁盘:

log1.log
log2.log
log3.log
log4.log
log5.log

如何实现?

最佳答案

您需要使用 Pool 的 initializer() 在工作人员启动后立即设置和注册单独的记录器。在后台,Pool(initializer)Pool(initargs) 的参数最终被传递给 Process(target)Process (args) 用于创建新的工作进程...

Pool-worker 以 {start_method}PoolWorker-{number} 格式命名,例如SpawnWorker-1 如果您使用 spawn 作为新进程的启动方法。然后可以使用 mp.current_process().name.split('-')[1] 从分配的工作人员名称中提取日志文件的文件编号。

import logging
import multiprocessing as mp


def f(x):
logger.info(f"x*x={x*x}")
return x*x


def _init_logging(level=logging.INFO, mode='a'):
worker_no = mp.current_process().name.split('-')[1]
filename = f"log{worker_no}.log"
fh = logging.FileHandler(filename, mode=mode)
fmt = logging.Formatter(
'%(asctime)s %(processName)-10s %(name)s %(levelname)-8s --- %(message)s'
)
fh.setFormatter(fmt)
logger = logging.getLogger()
logger.addHandler(fh)
logger.setLevel(level)
globals()['logger'] = logger


if __name__ == '__main__':

with mp.Pool(5, initializer=_init_logging, initargs=(logging.DEBUG,)) as pool:
print(pool.map(f, range(10)))

请注意,由于多处理的性质,无法保证您在小示例中最终得到的文件的确切数量。由于 multiprocessing.Pool(与 concurrent.futures.ProcessPoolExecutor 相反)在您创建实例后立即启动 worker,您一定会获得指定的 Pool( process) - 文件数,所以在你的情况下是 5。不过,你的操作系统的实际线程/进程调度可能会在这里缩短这个数字。

关于Python:如何为 multiprocessing.Pool 中的进程使用不同的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72408230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com