играет с чем-то, что должно быть совместимо как с Unix, так и с Windows. Первой идеей, которую я придумал, является использование файлов с отображенной памятью, поскольку это в основном механизм разделяемой памяти
с ними довольно легко работать под Python. например, вот функция для создания такого массива:
import numpy as np
from ctypes import sizeof, c_double
from mmap import mmap, ACCESS_DEFAULT
def shared_array(
shape, path, mode='rb', *,
dtype=c_double, access=ACCESS_DEFAULT
):
for n in reversed(shape):
dtype *= n
with open(path, mode) as fd:
if fd.writable():
size = fd.seek(0, 2)
if size < sizeof(dtype):
fd.truncate(sizeof(dtype))
buf = mmap(fd.fileno(), sizeof(dtype), access=access)
return np.ctypeslib.as_array(
dtype.from_buffer(buf)
)
т.е. создать «разделяемый массив NumPy» с заданной формой (т. е. (len,)
или (rows, cols)
), который появляется в файловой системе по заданному пути и с доступом, предоставленным mode
(т. е. rb
только для чтения, r+b
это читать, писать).
это можно использовать с кодом вроде:
from multiprocessing import Pool, set_start_method
def fn(shape, path):
array = shared_array(shape, path, 'r+b')
np.fill_diagonal(array, 42)
def main():
shape = (5, 10)
path = 'tmp.buffer'
array = shared_array(shape, path, 'w+b')
with Pool() as pool:
pool.apply(fn, (shape, path))
print(array)
if __name__ == '__main__':
set_start_method('spawn')
main()
Я использую Linux, поэтому явно установил процесс в стиле Windows spawn
ing style