Как избежать зависания процессов 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()
Ответ 2
Ответ от Jordan не помог мне. Это сработало:
display.sendstop()