Объедините Pool.map с Массивом общей памяти в многопроцессорной обработке Python

У меня есть очень большой массив (только для чтения) данных, что я хочу быть обработанным несколькими процессами параллельно.

Я люблю функцию Pool.map и хотел бы использовать ее для вычисления функций на те данные параллельно.

Я видел, что можно использовать класс Значения или Массива для использования данных общей памяти между процессами. Но когда я пытаюсь использовать это, я получаю RuntimeError: 'Объекты SynchronizedString должны только быть совместно использованы процессами посредством наследования при использовании функции Pool.map:

Вот упрощенный пример того, что я пытаюсь сделать:

from sys import stdin
from multiprocessing import Pool, Array

def count_it( arr, key ):
  count = 0
  for c in arr:
    if c == key:
      count += 1
  return count

if __name__ == '__main__':
  testData = "abcabcs bsdfsdf gdfg dffdgdfg sdfsdfsd sdfdsfsdf"
  # want to share it using shared memory
  toShare = Array('c', testData)

  # this works
  print count_it( toShare, "a" )

  pool = Pool()

  # RuntimeError here
  print pool.map( count_it, [(toShare,key) for key in ["a", "b", "s", "d"]] )

Кто-либо может сказать мне, что я делаю неправильно здесь?

Таким образом, то, что я хотел бы сделать, передать информацию о выделенном массиве недавно созданной общей памяти к процессам после того, как они были созданы в пуле процесса.

52
задан Acumenus 3 October 2019 в 04:54
поделиться

1 ответ

Если Вы видите RuntimeError: Synchronized objects should only be shared between processes through inheritance ошибка, рассматриваете использование multiprocessing.Manager , поскольку она не имеет этого ограничения. Менеджер работает, полагая, что это, по-видимому, работает в отдельном процессе в целом.

import ctypes
import multiprocessing

manager = multiprocessing.Manager()
counter = manager.Value(ctypes.c_ulonglong, 0)
counter_lock = manager.Lock()  # pylint: disable=no-member

with counter_lock:
    counter.value = count = counter.value + 1
0
ответ дан 7 November 2019 в 09:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: