Python 运行D总线环路时的非确定性插座连接
我为Rhythmbox创建了一个小型web界面,其后端使用该界面与播放器进行交互。方法和属性工作得很好,但我无法让信号部分(需要运行循环)按我希望的方式运行 我的想法是,我有一个运行的守护进程,可以连接到使用TCP,它发送事件使用的格式。问题是连接的处理非常奇怪,客户机立即获得连接,但是守护进程中产生的客户机套接字通常会在很久之后处理,如果它被处理的话 以下是守护进程的代码:Python 运行D总线环路时的非确定性插座连接,python,linux,sockets,dbus,Python,Linux,Sockets,Dbus,我为Rhythmbox创建了一个小型web界面,其后端使用该界面与播放器进行交互。方法和属性工作得很好,但我无法让信号部分(需要运行循环)按我希望的方式运行 我的想法是,我有一个运行的守护进程,可以连接到使用TCP,它发送事件使用的格式。问题是连接的处理非常奇怪,客户机立即获得连接,但是守护进程中产生的客户机套接字通常会在很久之后处理,如果它被处理的话 以下是守护进程的代码: #!/usr/bin/env python local_port = 9001 import socket impo
#!/usr/bin/env python
local_port = 9001
import socket
import thread
import sys
import os
import json
import subprocess
import shlex
import dbus
import dbus.mainloop.glib
import glib
import threading
def dbus_thread(lock, client_connections):
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
dbus.mainloop.glib.threads_init()
bus = dbus.SessionBus()
player_path = "org.mpris.MediaPlayer2.Player"
player_proxy = bus.get_object ("org.gnome.Rhythmbox3", "/org/mpris/MediaPlayer2")
player = dbus.Interface(player_proxy, player_path)
def sendToClients(message):
lock.acquire()
try:
for client_connection in client_connections:
socket, addr = client_connection
print "Sending message to " + str(addr) + "..."
try:
socket.sendall(message)
except:
print "Client dropped:", addr
client_connections.remove(client_connection)
finally:
lock.release()
def handleSeeked(position):
print "Seeked event:", position
sendToClients("event: Seeked\ndata: { 'position:' " + str(position) + " }\n\n")
player.connect_to_signal("Seeked", handleSeeked)
glib.MainLoop().run()
if __name__ == '__main__':
print "Daemon PID:", os.getpid()
server = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
server.bind(('localhost', local_port))
server.listen(10)
print "Server listening on:", server.getsockname()
lock = threading.Lock()
client_connections = [];
thread.start_new_thread(dbus_thread, (lock, client_connections))
while True:
print "Waiting for client connection..."
client_connection = server.accept()
print "Client connected:", client_connection[1]
sys.stdout.flush()
lock.acquire()
try:
client_connections.append(client_connection)
finally:
lock.release()
基本程序是:
- 创建可以接受连接的服务器套接字
- 创建存储连接的客户端的列表
- 创建运行D-Bus循环的后台线程
- 如果信号进入,则将事件数据写入所有活动连接
- 启动一个接受客户机并将其添加到列表中的循环
client_connection = server.accept()
执行得很好,从客户端获得连接判断,但之后的行只会在很长一段时间后执行,如果:
print "Client connected:", client_connection[1]
也许是D-Bus线程的干扰,我不知道。如果您对如何解决此问题有任何建议,我们将不胜感激。当不涉及DBus时,
server.accept()
是否及时完成?如果您编写了一个简单的测试脚本来测试它的响应性,它是令人满意的?@JB0x2D1:server.accept
工作得很好,否则,我还有一些其他web应用程序也在使用它,并且没有任何问题。也许选择端口9001?显然@JB0x2D1:当您尝试绑定到已在使用的套接字时,会出现错误。除了非常重要的低编号端口(21、22、80等)之外的任何端口通常不会在大多数系统中日常使用。