mutliproccessing是否可能导致流滞后?

时间:2017-07-08 19:47:17

标签: python sockets pyaudio

我有一台服务器从客户端接收音频流数据,然后将其发送到所有其他连接的客户端(通过套接字)。由于数据流使代码停留在循环上,我决定我应该为每个流创建进程(客户端本质上)。我注意到即使有一个连接的客户端,该过程也会导致音频滞后。这是为什么 ?如果我尝试使用线程,也会发生这种情况。

代码:

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)

2 个答案:

答案 0 :(得分:0)

没有代码或任何类型的规范,调试真的很难。但是,我确实知道为什么会出现这种滞后现象。 当您使用多处理时,您正在创建多个进程,每个进程都尝试同时连接到同一个外部套接字。多个同时连接可能会在糟糕的互联网上出现滞后现象。此外,如果你不使用锁,你将得到一个错误的输出,如果你使用它,它将导致进一步可能的滞后。因此,在这种情况下最好避免多处理。 至于线程,这可能是由于内置的​​锁定系统GIL而发生的。

答案 1 :(得分:0)

好的,我解决了。基本上,滞后是我的主代码在循环中运行尝试接收消息的结果,同时,我的过程也在做同样的事情。解决这种方式的方法是以消除服务器过载的方式更改代码。