【问题标题】:Python 3 multiprocessing.Process inside class?类内的Python 3 multiprocessing.Process?
【发布时间】:2017-12-30 23:31:30
【问题描述】:

我有一些复杂的类 A 来计算数据(大矩阵计算),同时使用类 B 的输入数据。

A 本身使用多个内核。然而,当 A 需要下一个数据块时,它会等待相当长的时间,因为 B 在同一个主线程中运行。

由于 A 主要使用 GPU 进行计算,我希望 B 在 CPU 上同时收集数据。

我最近的做法是:

# every time *A* needs data
def some_computation_method(self):
    data = B.get_data()
    # start computations with data

...和 ​​B 看起来大概是这样的:

class B(object):

    def __init__(self, ...):
        ...
        self._queue = multiprocessing.Queue(10)
        loader = multiprocessing.Process(target=self._concurrent_loader)

    def _concurrent_loader(self):
        while True:
            if not self._queue.full():
                # here: data loading from disk and pre-processing
                # that requires access to instance variables
                # like self.path, self.batch_size, ...
                self._queue.put(data_chunk)
            else:
                # don't eat CPU time if A is too busy to consume
                # the queue at the moment
                time.sleep(1)

    def get_data(self):
        return self._queue.get()

这种方法可以被视为“pythonic”解决方案吗?

由于我对 Python 的多处理模块没有太多经验,因此我构建了一种简单/简单的方法。但是,对我来说,它看起来有点“hacky”。​​

如果让一个类B同时从磁盘加载数据并通过某个队列提供数据,而主线程运行繁重的计算并不时消耗队列中的数据,这将是一个更好的解决方案?

【问题讨论】:

    标签: python python-3.x concurrency queue multiprocessing


    【解决方案1】:

    虽然您的解决方案完全没问题,尤其是对于“小型”项目,但它的缺点是线程与 B 类紧密耦合。因此,如果您(例如)出于某种原因想要以 线程的方式使用 B,那么您就不走运了。

    我会亲自以线程安全的方式编写该类,然后使用外部线程调用它:

    class B(object):
        def __init__(self):
            self._queue = multiprocessing.Queue(10)
    
        ...
    
    if __name__ == '__main__':
        b = B()
    
        loader = multiprocessing.Process(target=b._concurrent_loader)
        loader.start()
    

    这使B 更加灵活,更好地分离依赖关系并且更容易测试。与在类创建时隐式发生相比,它还通过对线程创建显式来使代码更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-19
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多