要从python中的套接字读取数据,请调用socket.recv,它具有以下签名:
socket.recv(bufsize[, flags])
注意: 为了与硬件和网络实际情况保持最佳匹配,bufsize的值应为2的较小乘方,例如4096。
问题 :“ 与硬件和网络现实最匹配 ”是什么意思?将bufsize设置为非2的幂次方有什么 实际 影响?
我已经看到许多其他
建议,以使其读数为2的幂。我也很清楚为什么将数组长度设为2的幂通常很有用的原因(长度的位移位/掩码操作,最佳FFT数组大小,等等),但它们取决于应用程序。我只是没有看到使用它的一般原因socket.recv。当然不是python文档中特定建议的重点。我也没有在基础python代码中看到任何二次幂优化来使其成为特定于python的建议
例如…如果您有一个协议,其中确切知道传入的数据包长度,则最好仅“最多”读取要处理的数据包所需的内容,否则可能会吞噬下一个数据包那会很烦人。如果我当前正在处理的数据包只有42个字节待处理,那么我只会将bufsize设置为42。
我想念什么?当我必须选择一个任意的缓冲区/数组大小时,通常(总是?)将长度乘以2的幂,以防万一。这只是多年以来养成的习惯。python文档也是习惯的受害者吗?
这不是python独有的,但是由于我专门引用python文档,因此将其标记为python。
更新 :我只是在系统的内核级别上检查了缓冲区的大小(或者至少我认为我做了…我做了cat
/proc/sys/net/core/rmem_default),它是124928。不是2的幂。 rmem_max是131071,显然也不是2的幂。
在深入研究这一点时,我真的看不到两项建议的作用。我准备将其称为虚假推荐…
我还添加了tcp和C标签,因为它们也很重要。