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
Мобильная версия