对于线程安全性和多处理,我有点不确定。
据我所知,multiprocessing.Pool.map腌制调用函数或对象,但完整保留引用传递的成员。
这似乎是有益的,因为它可以节省内存,但是我还没有在这些对象中找到任何有关线程安全的信息。
在我的情况下,我试图从磁盘读取numpy数据,但是我希望能够在不更改实现的情况下修改源代码,因此将读取部分分为自己的类。
我大致有以下情况:
import numpy as np
from multiprocessing import Pool
class NpReader():
def read_row(self, row_index):
pass
class NpReaderSingleFile(NpReader):
def read_row(self, row_index):
return np.load(self._filename_from_row(row_index))
def _filename_from_row(self, row_index):
return Path(row_index).with_suffix('.npy')
class NpReaderBatch(NpReader):
def __init__(self, batch_file, mmap_mode=None):
self.batch = np.load(batch_file, mmap_mode=mmap_mode)
def read_row(self, row_index):
read_index = row_index
return self.batch[read_index]
class ProcessRow():
def __init__(self, reader):
self.reader = reader
def __call__(self, row_index):
return reader.read_row(row_index).shape
readers = [
NpReaderSingleFile(),
NpReaderBatch('batch.npy'),
NpReaderBatch('batch.npy', mmap_mode='r')
]
res = []
for reader in readers:
with Pool(12) as mp:
res.append(mp.map(ProcessRow(reader), range(100000))
在我看来,这里有些事情可能会出错,但是不幸的是,我不具备确定对其进行何种测试的知识。
上述方法是否存在明显的问题?
发生在我身上的一些事情是: