Как избежать зависания процессов Xvfb [при использовании PyVirtualDisplay]?

Попытка найти, как избежать зависания процессов Xvfb в нашем приложении Python, при использовании PyVirtualDisplay. Существенная проблема заключается в том, что вызов display.stop() (см. Пример кода ниже), похоже, не корректно завершает процесс Xvfb.

PyVirtualDisplay очень просто используется:

from pyvirtualdisplay import Display

display = Display(backend='xvfb')
display.start()

... # Some stuff happens here

display.stop()

Теперь класс Display имеет небольшую модификацию, чтобы предотвратить использование Xvfb портами TCP: в основном, добавьте -nolisten tcp в исполняемую команду. Модификация выполняется путем переопределения соответствующего свойства класса _cmd класса XfvbDisplay:

@property
def _cmd(self):
    cmd = [PROGRAM,
           dict(black='-br', white='-wr')[self.bgcolor],
           '-screen',
           str(self.screen),
           'x'.join(map(str, list(self.size) + [self.color_depth])),
           self.new_display_var,
           '-nolisten',
           'tcp'
           ]
    return cmd

Каков правильный способ завершения процессов Xvfb в этом контексте, чтобы они были прерваны и не задерживались?

Большое спасибо!

Ответ 1

Ваш дисплей, так как он наследует от EasyProcess, будет иметь атрибут popen в display.popen. Вы можете использовать это для завершения, если EasyProcess работает неправильно.

Итак, вы можете сделать что-то вроде этого:

display.popen.terminate()

или

display.popen.kill()