Python多处理池进程的力分布

2024-04-23 08:01:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是由于试图将日志记录与多处理池相结合而产生的。在Linux下没有什么可做的;包含我的pool worker方法的模块继承了app logger的主要属性。在Windows下,我必须在每个进程中初始化记录器,这是通过运行pool.map_异步使用初始值设定项方法。问题是,该方法运行速度太快,以至于在某些进程中多次执行,而在其他进程中则根本没有执行。我可以让它正常工作,如果我添加一个短时间延迟的方法,但这似乎不雅观。在

有没有一种方法可以强制池均匀地分配进程?在

(一些背景:http://plumberjack.blogspot.de/2010/09/using-logging-with-multiprocessing.html

代码如下,我不能真正发布整个模块;-) 电话是这样的:

# Set up logger on Windows platforms
if os.name == 'nt':
    _ = pool.map_async(ml.worker_configurer,
                       [self._q for _ in range(mp.cpu_count())])

功能ml.worker_配置器这是:

^{pr2}$

新建辅助配置程序

def worker_configurer2(queue):
    root = logging.getLogger()
    if not root.handlers:
        h = QueueHandler(queue)
        root.addHandler(h)
        root.setLevel(logging.DEBUG)
    return

Tags: 模块方法mapifqueue进程linuxwindows
1条回答
网友
1楼 · 发布于 2024-04-23 08:01:56

你可以这样做:

sub_logger = None

def get_logger():
    global sub_logger
    if sub_logger is None:
        # configure logger

    return sub_logger

def worker1():
    logger = get_logger()
    # DO WORK

def worker2():
    logger = get_logger()
    # DO WORK

pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
result = pool.map_async(worker1, some_data)
result.get()
result = pool.map_async(worker2, some_data)
result.get()
# and so on and so forth

因为每个进程都有自己的内存空间(因此它有自己的一组全局变量),所以您可以将初始全局记录器设置为None,并且只有在以前没有配置过记录器的情况下才配置它。在

相关问题 更多 >