Python多处理池强制分配进程

时间:2014-11-16 15:10:42

标签: python multiprocessing pool

此问题是由于尝试将日志记录与多处理池相结合而产生的。在Linux下,没有什么可做的;包含我的pool worker方法的模块继承了主app logger属性。在Windows下,我必须在每个进程中初始化记录器,我通过使用初始化方法运行pool.map_async来完成。问题是该方法运行得如此之快,以至于在某些进程中不止一次执行,而在其他进程中则不执行。

,如果我给方法添加一个短时间延迟,我可以让它正常工作。

有没有办法强制池均匀分配流程?

(某些背景: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_configurer函数是这样的:

def worker_configurer(queue, delay=True):
    h = QueueHandler(queue)
    root = logging.getLogger()
    root.addHandler(h)
    root.setLevel(logging.DEBUG)
    if delay:
        import time
        time.sleep(1.0)
    return

新工人配置器

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

1 个答案:

答案 0 :(得分:0)

您可以这样做:

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,并且只有先前的记录器才能配置它配置。