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
Подробнее здесь: https://stackoverflow.com/questions/792 ... known-lock
Мобильная версия