Python многопроцессорный пул, совместно используемый модулями - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь распараллелить код для одного из моих проектов с помощью многопроцессорной обработки. В этом проекте у меня есть 3 модуля: A, B и C, каждый из которых содержит класс с тем же именем модуля. Класс в модуле A создает экземпляры объектов из модулей B и C, а затем создается с помощью сценария в другом файле, который выполняет в нем функцию.

Теперь каждый из этих классов (A, B и * 1012) *) есть метод, который запускает некоторые манипуляции с массивами, которые я бы запустил параллельно. До сих пор мой подход заключался в том, чтобы создать экземпляр пула внутри метода, позволить ему запустить код, необходимый для его запуска, а затем завершить пул, когда это будет сделано. Проблема заключается в том, что эти методы вызываются несколько раз, поэтому создание и уничтожение пула каждый раз заставляет код становиться все медленнее и медленнее.

Есть ли способ создать глобальный пул, который будет совместно использоваться модулями они называют это, когда им это нужно, без необходимости каждый раз создавать и уничтожать его?

# A.py
import B, C

class A(){
  def __init__(self):
    b = B()
    c = C()

  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]

  def main(self):
    b.method()
    c.method()
    self.method()
# B.py
class B(){
  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]
}
# C.py
class C(){
  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]
}
# script.py
import A
if __name__ = '__main__':
  a = A()
  a.main()

1 Ответ

0 голосов
/ 13 марта 2020

Я думаю, у вас есть 2 варианта:

  1. Передать пул между классами как переменную. Ограничение на количество процессов / потоков ограничит переключение процессов, которое, вероятно, влияет на вас.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...