基本的に問題は、VLCのすべてのインスタンスを取得する唯一の方法は、名前のないすべてのインスタンスでorg.freedesktop.MediaPlayer ID関数を検索し、それを呼び出すことです。
(または、イントロスペクションAPIを使用することもできますが、これでは問題が解決しないようです)残念ながら、dbus呼び出しを送信した多くのプログラムは、単に応答せず、長くてコストのかかるタイムアウトが発生します。
これが複数回発生すると、合計する可能性があります。基本的に、組み込みのタイムアウトは長すぎます。
どういうわけかdbusタイムアウトを減らすことができれば、それで問題は解決しますが、理想的な解決策は方法です。
「Identify」への各呼び出しをスレッド内に置くことができ、時間がかかりすぎるスレッドを強制終了できるという考えが浮かびましたが、これは示唆されていないようです。また、マルチスレッドを追加すると、CPUの負荷が大幅に増加しますが、プログラムの速度はそれほど向上しません。
これが私が速く(多かれ少なかれ)実行しようとしているコードですが、現在は痛々しいほど遅いです。
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