2016-12-07 4 views
1

У меня есть два объектаДоля NumPy и SciPy объекты между процессами

shared_array = numpy.zeros(20) 

и

shared_matrix = scipy.sparse.csr_matrix((data, (row, col)),(20,20),dtype=numpy.float64) 

, который я хочу, чтобы быть доступным из всех процессов, созданных с

multiprocessing.Process(target = random_function, args = (shared_matrix, shared_array)) 

Как это сделанный?

ответ

2

Если вы просто хотите получить к нему доступ, вы можете. Вы можете читать данные из глобальных переменных во всех процессах, созданных multiprocessing.

Однако, если вы хотите написать, например, словарь (с осторожностью не переписывать), вы можете использовать объекты общей памяти. multiprocessing имеет встроенный manager, откуда вы можете вызывать все объекты общей памяти, такие как списки, dicts.

Вы передаете все свои объекты в аргументах, поэтому он будет доступен для всех процессов, однако, если вы внесете изменения внутри объекта, он не будет постоянным, поскольку он не будет постоянным с простой функцией.

Простой пример для Numpy массива:

import numpy as np 
import multiprocessing 

a = np.zeros(5) 

def func(b): 
    ns.array += b 
    return 

manager = multiprocessing.Manager() 
ns = manager.Namespace() 
ns.array = np.zeros(5) 
pool = multiprocessing.Pool(2) 

list(pool.imap_unordered(func, [1,2])) 
print(ns.array) 

Выведет [ 3. 3. 3. 3. 3.]

Вот еще очень подробное решение: https://stackoverflow.com/a/7908612/4555249

+0

Я хочу, чтобы иметь возможность читать и писать. Я видел менеджера, но они работают с 'numpy.array' и' scipy.sparse.csr_matrix'? – Chicony

+0

Как я писал, вы можете читать все глобальные переменные внутри каждого процесса, порожденного «многопроцессорностью». Вы даже не должны передавать их в качестве аргументов. –

+0

Но я хочу также иметь возможность редактировать их, а не просто читать. – Chicony

Смежные вопросы