Многопроцессорность 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


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

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

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

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

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

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