Python插座:使用send()和recv()时有关网络缓冲区的问题



首先,我已经阅读了大约很多时间,包括此站点上的许多线程,但是我仍然需要在Python的插座,TCP和网络上进行一些澄清,因为我觉得就像我不完全了解程序中正在发生的事情一样。


我正在使用UNIX域套接字(AF_UNIX(使用TCP(SOCK_STREAM(将数据从服务器发送到客户端。

在服务器端,一个过程不断将项目放在队列上。标题和另一个过程是通过运行

将项目发送给客户端
while True:
    conn.sendall(queue.get())

在客户端,通过运行

读取数据
while True:
    conn.recv(1024)
    # time.sleep(10)

现在,我通过将客户流程发送到RECV((上的每次呼叫后,都会效仿慢速客户端。我期望的是,服务器端的队列已填充,因为send((应该阻止服务器,因为客户端无法足够快地读取数据。

i监视发送给客户端的物品数量以及队列大小。我注意到的是,发送了几张十二条消息(大致取决于消息的大小,但消息大小的行为可能相同(已发送给客户端(由于Time.seep((,客户收到了延迟的客户收到的消息。(在队列开始填充之前。


这里发生了什么?为什么send((不立即阻止?

我怀疑涉及某种网络或文件缓冲区,该网络或文件缓冲区在我实施的队列之前排队并填充。

系统中的各个位置,发件人和接收器都有许多缓冲区。在填充所有这些缓冲区之前,您对发送功能的调用不会阻止。当接收器排出一些缓冲区时,数据将再次流动,最终将解除发送呼叫的障碍。

通常,发件人中持有数据等待电线的发送器中有一个缓冲区,"飞行中"的缓冲区允许发送一定数量的字节,然后再等待接收者确认,最后接收缓冲区已确认但尚未传递到接收申请的数据。

不是这样,前进的进度将非常有限。发件人将被卡住,等待发送,直到接收器打电话给接收。然后,首先要结束的任何一个都必须等待另一个。即使发件人首先完成,直到接收器完成以前的数据块完成之前,它也无法取得任何前进的进度。对于大多数应用程序,这将是非常最佳的。

最新更新