gpt4 book ai didi

类中的 Python 3 multiprocessing.Process?

转载 作者:太空狗 更新时间:2023-10-30 01:32:07 24 4
gpt4 key购买 nike

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

A 本身使用多个核心。然而,当 A 需要下一个数据 block 时,它会等待相当长的一段时间,因为 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 并发地从磁盘加载数据并通过某个队列提供数据,而主线程运行繁重的计算并时常从队列中消耗数据,这将是一个更好的解决方案?

最佳答案

虽然您的解决方案完全没问题,尤其是对于“小型”项目,但它的缺点是线程与类 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 更加灵活,更好地分离依赖关系并且更容易测试。与在类创建时隐式发生相比,它还通过显式线程创建使代码更具可读性。

关于类中的 Python 3 multiprocessing.Process?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45296526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com