Многопроцессорность Python: как снять неизвестную блокировку?Python

Программы на Python
Ответить
Anonymous
 Многопроцессорность Python: как снять неизвестную блокировку?

Сообщение Anonymous »

Это вопрос о том, что многопроцессорное выполнение застревает в сочетании со сторонним пакетом (предположим, мы называем его пакетом). Давайте представим, что это мой код
def work(arg):
from package import f
return f(arg)

from multiprocessing import Pool
pool = Pool(8)
args = [ i for i in range(80) ]
results = pool.map(work, args)
for result in results:
result
pool.close()

В моем конкретном случае этот код работает нормально, пока я не использую другие функции пакета. Если я изменю скрипт следующим образом:
def work(arg):
from package import f
return f(arg)

from package import SomeClass
obj = SomeClass()

from multiprocessing import Pool
pool = Pool(8)
args = [ i for i in range(80) ]
results = pool.map(work, args) # execution gets stuck on this line
for result in results:
result
pool.close()

затем он застревает в закомментированной строке, потому что f не возвращает результат. Поскольку это сторонний пакет, я несовершенно знаю его внутреннюю работу, но не вижу причин (используя разумное количество времени), чтобы SomeClass зависел от того, что происходит в работе. Поскольку мне не нужен объект obj, когда я перехожу к многопроцессорной обработке, я хочу удалить его (или иным образом сделать неэффективным его взаимодействие с f), надеясь, что карта сможет выполниться. Но это не помогает
def work(arg):
from package import f
return f(arg)

from package import SomeClass
obj = SomeClass()
del obj
import gc
gc.collect()

from multiprocessing import Pool
pool = Pool(8)
args = [ i for i in range(80) ]
results = pool.map(work, args) # execution still gets stuck on this line
for result in results:
result
pool.close()
  • Могу ли я что-нибудь сделать в разумные сроки, чтобы выяснить, что вызывает блокировку выполнения карты?
  • Я хочу использовать грубую силу, чтобы избавиться от блокировки (или чего-то еще в SomeClass, предотвращающего выполнение) после того, как я закончу с obj. Каковы мои варианты достижения этой цели?
Изменить:
Он работает для выполнения второй функции, не входящей в параллельно:
def work(arg):
from package import f
return f(arg)

from package import SomeClass
obj = SomeClass()
obj = None
del obj
import gc
gc.collect()

from multiprocessing import Pool
pool = Pool(8)
arg = 42
work(arg) # execution work if I don't run it in parallel

Edit2:
Вот минимальный воспроизводимый пример.
from pyscf.pbc.gto import Cell
import numpy as np
from pyscf.pbc.dft import numint

# comment out the following 6 lines to allow work to return successfully.
cell1 = Cell()
cell1.a = "\n".join([f"{str(row).replace(',','').strip('[]')}" for row in np.eye(3)])
cell1.atom = "\n".join([f"C {str(row).replace(',','').strip('[]')}" for row in np.random.rand(3,3)])
cell1.build()
mf = cell1.RKS()
ao_value = numint.eval_ao(cell1, mf.grids.coords)
# comment out the preceeding 6 lines to allow work to return successfully.

cell2 = Cell()
cell2.a = "\n".join([f"{str(row).replace(',','').strip('[]')}" for row in np.eye(3)])
cell2.atom = "\n".join([f"C {str(row).replace(',','').strip('[]')}" for row in np.random.rand(3,3)])
cell2.build()

def work( cell ):
grid_coords = np.random.rand(3, 3)
print("gets stuck after this line...")
ao = cell.pbc_eval_gto("GTOval_cart", grid_coords)
print("...and before this line")
return 1

from multiprocessing import Pool
pool = Pool(1)
args = [ cell2 for I in np.arange(1) ]
results = pool.imap(work, args)
for result in results: I = result
pool.close()


Подробнее здесь: https://stackoverflow.com/questions/792 ... known-lock
Ответить

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

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

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

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

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