Как узнать, где / почему зависает процесс? - PullRequest
0 голосов
/ 04 августа 2020

(Отказ от ответственности: я не ожидаю, что кто-то скажет мне, что именно не так, просто некоторые способы, которые могут ускорить процесс обнаружения). У меня очень сложная функция, которая работает как отдельный процесс (некоторые из функции, которые он вызывает, находятся внутри расширений 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.

Итак, мои вопросы:

  1. возможно ли, что процесс зависает без чего-либо что вызывает исключения?
  2. Как я могу определить, что вызывает его зависание?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...