我正在使用池来获益多核。池中的每个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
答案 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