Общие массивы в многопроцессорном PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Общие массивы в многопроцессорном Python

Сообщение Anonymous »

Я пытаюсь писать в том же общем массиве в сценарии Python с параллельной обработкой.

Когда я делаю это вне класса, в обычном сценарии, все работает правильно. Но когда я пытаюсь сделать это через класс (используя тот же код), я получаю

Runtime Error: SynchronizedArray objects should only be shared between processes through inheritance.

Мой сценарий следующий (без класса):

import numpy
import ctypes

from multiprocessing import Pool, Array, cpu_count

n = 2

total_costs_matrix_base = Array(ctypes.c_double, n*n)
total_costs_matrix = numpy.ctypeslib.as_array(
total_costs_matrix_base.get_obj())
total_costs_matrix = total_costs_matrix.reshape(n,n)

def set_total_costs_matrix( i, j, def_param = total_costs_matrix_base):
total_costs_matrix[i,j] = i * j

if __name__ == "__main__":

pool = Pool(processes=cpu_count())
iterable = []

for i in range(n):
for j in range(i+1,n):
iterable.append((i,j))
pool.starmap(set_total_costs_matrix, iterable)
total_costs_matrix.dump('some/path/to/file')


Этот сценарий работает хорошо. А вот следующий (который использует класс):

import numpy
import ctypes

from multiprocessing import Pool, Array, cpu_count

class CostComputation(object):
"""Computes the cost matrix."""

def __init__(self):
self.n = 2

self.total_costs_matrix_base = Array(ctypes.c_double, self.n*self.n)
self.total_costs_matrix = numpy.ctypeslib.as_array(
self.total_costs_matrix_base.get_obj())
self.total_costs_matrix = self.total_costs_matrix.reshape(self.n,self.n)

def set_total_costs_matrix(self, i, j, def_param = None):
def_param = self.total_costs_matrix_base
self.total_costs_matrix[i,j] = i * j

def write_cost_matrix(self):
pool = Pool(processes=cpu_count())
iterable = []

for i in range(self.n):
for j in range(i+1,self.n):
iterable.append((i,j))
pool.starmap(self.set_total_costs_matrix, iterable)
self.total_costs_matrix.dump('some/path/to/file')


После этого я бы вызвал write_cost_matrix из другого файла, после создания экземпляра CostComputation.
Я прочитал этот ответ, но так и не смог решить свою проблему.

Я использую Python 3.4.2 в Mac OSX Yosemite 10.10.4 .

РЕДАКТИРОВАТЬ

При использовании класса CostComputation я использую следующий сценарий:

from cost_computation import CostComputation

cc = CostComputation()
cc.write_costs_matrix()


Вся ошибка:

Traceback (most recent call last):
File "app.py", line 65, in
cc.write_cost_matrix()
File "/path/to/cost_computation.py", line 75, in write_cost_matrix
pool.starmap(self.set_total_costs_matrix, iterable)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 268, in starmap
return self._map_async(func, iterable, starmapstar, chunksize).get()
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 599, in get
raise self._value
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 383, in _handle_tasks
put(task)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/sharedctypes.py", line 192, in __reduce__
assert_spawning(self)
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/context.py", line 347, in assert_spawning
' through inheritance' % type(obj).__name__
RuntimeError: SynchronizedArray objects should only be shared between processes through inheritance


Подробнее здесь: https://stackoverflow.com/questions/317 ... ing-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Запись OpenCV GStreamer VideoWriter зависает в многопроцессорном процессе Python
    Anonymous » » в форуме Python
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Как эффективно запустить модель вывода большого размера в многопроцессорном процессоре?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Массивы и векторы: общие сходства и различия
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу объединить 3D-массивы с помощью np.concatenate в numpy, в то время как 1D- и 2D-массивы работают?
    Anonymous » » в форуме Python
    0 Ответы
    44 Просмотры
    Последнее сообщение Anonymous
  • Как преобразовать массивы UInt32[] и Int32[] в байтовые массивы?
    Anonymous » » в форуме C#
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»