Потерянные подпроцессы после завершения работы cef python, несмотря на очистку - PullRequest
0 голосов
/ 05 марта 2020

Моя программа cef python приводит к потере сироты subprocess.exe в диспетчере задач (я нахожусь на Windows 10). (Они продолжаются бесконечно и используют значительный процессор.)

Но они появляются, только когда я заканчиваю программу с помощью Ctrl- C в командной строке, а не когда я обычно выхожу из окна GUI, например, из Панель задач.

Я знаю, что при использовании cef python, для очистки в конце программы вам нужно

  1. вызвать cef.Shutdown () .
  2. удалить все ссылки на браузеры cef
  3. при использовании cef python с wx Python, удалить ссылки на приложение wx

(Это все продемонстрировано в примере cef python wx Python здесь .)

Я сделал эти вещи в своей программе, как показано ниже:

def start(self):
    signal(SIGINT, lambda sig, frame: self.stop())

    sys.excepthook = cefpython.ExceptHook
    cefpython.Initialize({"multi_threaded_message_loop": True})

    self.app = MyApp(clearSigInt=False)

    self.app.MainLoop()

    self.stop()

def stop(self): 
    self.app.removeBrowserReferences()  # calls `self.browser = None` on my custom wx.App class
    del self.app
    print("App is deleted.")
    cefpython.Shutdown()  # I believe it is fine that this terminates the program, since the next line never prints.
    print("Shutdown is called.")

Обратите внимание, что этапы очистки в .stop() выполняются в обоих сценариях ios, либо из MainL oop, завершающего и вызывающего последующий .stop(), либо из Ctrl- C, запускающего обработчик SIGINT, который равен .stop().

Чего еще не хватает для очистки после cef python и wx Python?

A В качестве альтернативы, есть ли способ идентифицировать эти потерянные процессы, чтобы при запуске программы они могли их убить? (Тогда, по крайней мере, они не будут расти после 1.)

РЕДАКТИРОВАТЬ:
Как спросил @Igor, оказывается, что вы МОЖЕТЕ воспроизвести его в неизмененном примере из cef python Сделки рЕПО! Это несколько редко; Я должен запустить его, Ctrl- C, запустить его, Ctrl- C и др. c. но в конце концов я получаю потерянный subprocess.exe, который использует> 20% ЦП бесконечно. (Обратите внимание, что моя система не испытывает особой нагрузки или чего-то в этом роде. Процессор загружается на 1-5% перед воспроизведением проблемы.)

Файлы здесь: https://github.com/cztomczak/cefpython/issues/562

...