Nano Hash - криптовалюты, майнинг, программирование

Параллельная обработка с пулом в Python

Я попытался запустить параллельную обработку локально определенной функции следующим образом:

import multiprocessing as mp                                                                                               
import numpy as np
import pdb


def testFunction():                                                                                                        
  x = np.asarray( range(1,10) )
  y = np.asarray( range(1,10) )

  def myFunc( i ):
    return np.sum(x[0:i]) * y[i]

  p = mp.Pool( mp.cpu_count() )
  out = p.map( myFunc, range(0,x.size) )
  print( out )


if __name__ == '__main__':
  print( 'I got here' )                                                                                                         
  testFunction()

Когда я это делаю, я получаю следующую ошибку:

cPickle.PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

Как я могу использовать многопроцессорность для параллельной обработки нескольких массивов, как я пытаюсь сделать здесь? x и y обязательно определены внутри функции; Я бы предпочел не делать их глобальными переменными.

Вся помощь приветствуется.


  • Я думаю, у вас неправильное представление о том, как работает многопроцессорность - функции, вызываемые картой, будут выполняться в отдельных процессах без понятия локальных данных функции. Вам нужно будет передать данные для обработки функции, которая будет их обрабатывать, либо явно в параметре карты, либо путем передачи данных, например, через Очередь. 21.05.2019
  • @barny Как я могу передавать данные? Обратите внимание, что мне не нужно менять x или y; Мне просто нужно их использовать. 22.05.2019
  • Вы читали документацию, например. docs.python.org/3/library/multiprocessing.html — вы можете попробуйте общую память, может быть? В противном случае вам придется явно отправлять данные, с которыми он будет работать, каждому процессу. 22.05.2019
  • @barny Я прочитал документацию и борюсь с ней. Как можно использовать общую память? Как я могу явно отправить данные каждому процессу? 22.05.2019

Ответы:


1

Просто сделайте функцию обработки глобальной и передавайте пары значений массива вместо ссылки на них по индексу в функции:

import multiprocessing as mp

import numpy as np


def process(inputs):
    x, y = inputs

    return x * y


def main():
    x = np.asarray(range(10))
    y = np.asarray(range(10))

    with mp.Pool(mp.cpu_count()) as pool:
        out = pool.map(process, zip(x, y))

    print(out)


if __name__ == '__main__':
    main()

Выход:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

ОБНОВЛЕНИЕ: согласно предоставленным новым сведениям, вы должны совместно использовать массивы между различными процессами. Именно для этого используется multiprocessing.Manager.

Объект менеджера, возвращаемый функцией Manager(), управляет серверным процессом, который содержит объекты Python и позволяет другим процессам манипулировать ими с помощью прокси-серверов.

Таким образом, результирующий код будет выглядеть примерно так:

from functools import partial
import multiprocessing as mp

import numpy as np


def process(i, x, y):
    return np.sum(x[:i]) * y[i]


def main():
    manager = mp.Manager()

    x = manager.Array('i', range(10))
    y = manager.Array('i', range(10))

    func = partial(process, x=x, y=y)

    with mp.Pool(mp.cpu_count()) as pool:
        out = pool.map(func, range(len(x)))

    print(out)


if __name__ == '__main__':
    main()

Выход:

[0, 0, 2, 9, 24, 50, 90, 147, 224, 324]
22.05.2019
  • Я бы предпочел pool.starmap, если у вас несколько параметров 22.05.2019
  • Спасибо за помощь! Я немного изменил задачу, потому что мне нужно сделать что-то большее, чем перебирать x. Как можно скорректировать решение, чтобы решить эту проблему? 23.05.2019
  • @ user24205 Я обновил ответ, так что теперь разные процессы используют одни и те же массивы данных. 23.05.2019
  • @Rightleg Еще раз большое спасибо! И последний вопрос: что, если общая переменная — это не массив, а нечто более сложное? В моем случае я пытаюсь поделиться выводом функции Вороного scipy (что сложно, я точно не знаю, что это такое). 24.05.2019
  • @user24205 user24205, если вы не знаете, что такое вывод, то как вы собираетесь его использовать? :) В любом случае, я бы предложил преобразовать ваши данные в массивы, прежде чем делиться ими между рабочими процессами, использовать какую-то предварительную обработку, прежде чем передавать ваши данные рабочим. 25.05.2019
  • @constt Спасибо. 27.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..