我有一台服务器从客户端接收音频流数据,然后将其发送到所有其他连接的客户端(通过套接字)。由于数据流使代码停留在循环上,我决定我应该为每个流创建进程(客户端本质上)。我注意到即使有一个连接的客户端,该过程也会导致音频滞后。这是为什么 ?如果我尝试使用线程,也会发生这种情况。
代码:
p_r = Process(target=playback_f,
args=(pass_record, soc, client, port_a, data, c)).start()
soc
是相关客户端的套接字连接,data
是初始数据,c
是以下结果:
c, addr1 = s.accept()
流程调用:
def playback_f(pass_record, soc, client, port_a, data, c):
try:
stop_recording = False
try :
soc.sendto('playback'.encode('utf-8'),(client,port_a))
except Exception as e:
print (e)
while stop_recording == False:
if data != b'stop_rec':
try:
data = c.recv(1024)
soc.sendto(data,(client,port_a))
except Exception as e:
print (e)
else:
stop_recording = True
print('ended')
except Exception as e:
print(e)
答案 0 :(得分:0)
没有代码或任何类型的规范,调试真的很难。但是,我确实知道为什么会出现这种滞后现象。 当您使用多处理时,您正在创建多个进程,每个进程都尝试同时连接到同一个外部套接字。多个同时连接可能会在糟糕的互联网上出现滞后现象。此外,如果你不使用锁,你将得到一个错误的输出,如果你使用它,它将导致进一步可能的滞后。因此,在这种情况下最好避免多处理。 至于线程,这可能是由于内置的锁定系统GIL而发生的。
答案 1 :(得分:0)
好的,我解决了。基本上,滞后是我的主代码在循环中运行尝试接收消息的结果,同时,我的过程也在做同样的事情。解决这种方式的方法是以消除服务器过载的方式更改代码。