没有“global”关键字的每个工作者的永久对象池

时间:2012-10-30 09:03:51

标签: python multiprocessing

我正在使用池来获益多核。池中的每个worker都需要自己的Calculator对象。计算器的初始化非常耗时,所以我想让它在池中的每个工人只生成一次,而不是每次都有新的任务到来。唯一的方法是,我使用“丑陋”关键字global。有没有“更清洁”的方式来实现这个?

我想避免队列(父线程通常是sigkill'd并在使用队列时离开子进程)和管理器(性能太慢)。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import multiprocessing

def init_pool():
    global calculator
    calculator = Calculator()   # should only executed ones per worker

def run_pool(args):
    return calculator.calculate(*args)  # time consuming calculation

class Organiser():
    def __init__(self):
        self.__pool = multiprocessing.Pool(initializer=init_pool)

    def process(self, tasks):
        results = self.__pool.map(run_pool, tasks)
        return results

1 个答案:

答案 0 :(得分:2)

我没有看到实现你想要的方法(每个工人只准备一次)。

但是,如果您想为整个工作人员初始化一次“计算器”,则以下情况似乎有效。

def run_pool(args):
    calculator,arg = args
    return calculator.calculate(arg)  # time consuming calculation

class Organiser():
    def __init__(self):
        self.calculator = Calculator()
        self.__pool = multiprocessing.Pool(processes=4)

    def process(self, tasks):
        results = self.__pool.map(run_pool, [(self.calculator,data) for data in tasks])
        return results

要为每个工人准确初始化一次,在我看来,您必须使用全局变量或单例(等效)。我也将等待你的问题的其他答案:)

此致 亚洲时报Siddharth