使用每个工作进程都有永久对象池而不需要“全局”关键字

5
我正在使用一个池来充分利用多个核心。池中的每个工作进程都需要自己的计算器对象。计算器的初始化非常耗时,因此我希望每个工作进程只生成一次计算器对象,而不是每次有新任务到达就生成。我得到这个工作的唯一方法是使用“丑陋”的关键字 global 。是否有更“清洁”的方法来实现这个? 我希望避免使用队列(父线程经常被sigkill并留下子进程),以及管理器(性能太慢)。
#!/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个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接