Я читал, что RawArray
может быть разделен между процессами без копирования, и хотел понять, как это возможно в Python.
Я видел в sharedctypes.py , что RawArray
создается из BufferWrapper
из heap.py , затем обнуляется с помощью ctypes.memset
.
BufferWrapper
сделан из объекта Arena
, который сам построен из mmap
(или 100 mmaps в окнах, см. Строку 40 в heap.py )
Я прочитал, что системный вызов mmap
фактически используется для выделения памяти в Linux / BSD, а модуль Python использует MapViewOfFile для окон.
mmap
тогда кажется удобным. Кажется, он может работать напрямую с mp.pool
-
from struct import pack
from mmap import mmap
def pack_into_mmap(idx_nums_tup):
idx, ints_to_pack = idx_nums_tup
pack_into(str(len(ints_to_pack)) + 'i', shared_mmap, idx*4*total//2 , *ints_to_pack)
if __name__ == '__main__':
total = 5 * 10**7
shared_mmap = mmap(-1, total * 4)
ints_to_pack = range(total)
pool = Pool()
pool.map(pack_into_mmap, enumerate((ints_to_pack[:total//2], ints_to_pack[total//2:])))
Мой вопрос -
Откуда модуль многопроцессорной обработки узнает, что не копирует объект RawArray
на основе mmap
между процессами, как это происходит с "обычными" объектами python?