По сути, проблема в том, что единственный способ получить все экземпляры VLC - это найти во всех неименованных экземплярах функцию идентификации org.freedesktop.MediaPlayer и вызвать ее.
(в качестве альтернативы я мог бы использовать API интроспекции, но это, похоже, не решило бы мою проблему)
К сожалению, многие программы после отправки вызова по протоколу dbus просто не отвечают, что приводит к длительному и дорогостоящему таймауту.
Когда это происходит несколько раз, оно может сложиться.
По сути, встроенный тайм-аут слишком длинный.
Если я смогу каким-то образом уменьшить время ожидания dbus, это решит мою проблему, но идеальным решением будет способ.
Мне пришла в голову мысль, что я могу помещать каждый вызов «Identify» внутри потока и что я могу уничтожать потоки, которые занимают слишком много времени, но, похоже, это не рекомендуется. Кроме того, добавление многопоточности значительно увеличивает нагрузку на процессор, не сильно увеличивая скорость работы программы.
Вот код, который я пытаюсь запустить быстро (более или менее), который в настоящее время мучительно медленный.
import dbus
bus = dbus.SessionBus()
dbus_proxy = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
names = dbus_proxy.ListNames()
for name in names:
if name.startswith(':'):
try:
proxy = bus.get_object(name, '/')
ident_method = proxy.get_dbus_method("Identity",
dbus_interface="org.freedesktop.MediaPlayer")
print ident_method()
except dbus.exceptions.DBusException:
pass