首先,当然,我已经阅读了相当多的时间,包括这个站点上的许多线程,但是我仍然需要一些关于套接字、TCP和Python网络的澄清,因为我觉得我不完全理解我的程序中发生了什么。你知道吗
我使用TCP(SOCK\ u流)通过Unix域套接字(AF\ Unix)将数据从服务器发送到客户机。你知道吗
在服务器端,一个进程不断地将项目放到排队。排队另一个进程是通过运行
while True:
conn.sendall(queue.get())
在客户端,通过运行
while True:
conn.recv(1024)
# time.sleep(10)
现在,我通过在每次调用recv()之后将客户端进程发送到sleep来模拟慢速客户端。我所期望的是服务器端的队列已经满了,因为send()应该被阻塞,因为客户端读取数据的速度不够快。你知道吗
我监视发送到客户机的项目数以及队列大小。我注意到有几十条消息(大致取决于消息的大小,但稍有不同的消息大小可能表现相同)被发送到客户机(由于以下原因,客户机会延迟接收这些消息)时间.渗漏())在队列开始填满之前。你知道吗
这里发生了什么?为什么send()没有立即阻塞?你知道吗
我怀疑涉及到某种网络或文件缓冲区,它将发送项目排队,并在我实现的队列之前填满。你知道吗
在系统的各个地方,发送方和接收方都有许多缓冲区。对发送函数的调用在所有缓冲区被填满之前不会被阻塞。当接收器耗尽一些缓冲区时,数据将再次流动,并最终解除发送呼叫的阻塞。你知道吗
通常,发送方中有一个缓冲区,保存着等待传输的数据,一个缓冲区“在飞行中”,允许在等待接收方确认之前发送一定数量的字节,最后接收缓冲区,保存着已经确认但尚未发送到接收应用程序的数据。你知道吗
如果不是这样,向前的进展将极为有限。发送方将一直等待发送,直到接收方调用receive。那么,谁先完成谁就得等另一个。即使发送方先完成,在接收方完成前一个数据块的处理之前,它也无法进行任何转发。这对于大多数应用程序来说都是次优的。你知道吗
相关问题 更多 >
编程相关推荐