【发布时间】: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