(Отказ от ответственности: я не ожидаю, что кто-то скажет мне, что именно не так, просто некоторые способы, которые могут ускорить процесс обнаружения). У меня очень сложная функция, которая работает как отдельный процесс (некоторые из функции, которые он вызывает, находятся внутри расширений C ++), и он зависает при выходе. Код выглядит так:
def process_to_run(queue, some_complex_object):
do_stuff(some_complex_object)
queue.put(some_generated_data)
if __name__ == "__main__":
some_complex_objects = getSomeComplexObjects() # returns a list of objects
queue = multiprocessing.Queue()
processes = []
for i in range(4):
processes.append(multiprocessing.Process(target=process_to_run, args=(queue, some_complex_objects[i]))
for process in processes:
process.start()
results = []
for i in range(4):
results.append(queue.get())
for process in processes:
process.join()
Проблема в том, что do_stuff зависает без выдачи исключений. До сих пор я пытался убить процесс с помощью os
или psutil
, но ни один из них не работал (процесс продолжает зависать даже после того, как я вызываю kill()
). Я также попытался обернуть его в try except
с traceback
, как предлагалось здесь :
def do_stuff():
try:
# some code
except Exception:
import traceback
traceback.print_exec()
print("end")
, однако он не печатает ничего, кроме end
. Я также пробовал sys.exc_info()
, но единственное, что я получил, это None
.
Итак, мои вопросы:
- возможно ли, что процесс зависает без чего-либо что вызывает исключения?
- Как я могу определить, что вызывает его зависание?
Спасибо