我一直在研究UDP的阻塞和非阻塞套接字,但很难理解它们之间的优劣。互联网上绝大多数评论似乎表明非阻塞更好,但并没有很具体地说明什么情况下使用非阻塞更好,至今我还没有找到什么参考资料能够说明在何种情况下使用阻塞更为可取。我希望社区能够在这个问题上提供一些见解。
为了让答案可以具体应用于我的问题集,下面简单介绍一下背景。我正在编写一个UDP服务器,在本地局域网上拥有40个连接,并且会不断流入数据。数据速率将平均达到250MB/s,峰值可达500+Mb/s,平均数据包大小约为1400字节。处理数据包的负载较轻,但由于消息数量巨大,效率和性能成为高优先级任务,以防止丢失数据包。
由于我没有找到与这个特定问题集类似的上下文信息,因此根据我所能获取的关于阻塞和非阻塞的信息,我不得不做出一些猜测。基本上,由于每个连接都将是几乎不断的数据包流,我认为使用阻塞套接字更可取,因为任何recv函数实际上被阻塞的时间将非常短暂,而使用事件驱动模型则会产生大量异步触发。我认为真正的问题在于管理40个线程的优先级,以确保每个线程都能获得其份额的CPU时间。我的想法和方法可能不正确,因此希望社区能够提供一些帮助。
~编辑~
虽然我担心线程设计如何影响/整合阻止/非阻止问题,但我真正关心的是从我的问题集的角度来看阻塞/非阻塞应该如何看待。如果线程确实成为问题,我可以选择线程池解决方案。
首先,想要感谢截至目前为止已经给出的回复。你们中的一些人提到,使用这么多套接字的单线程/套接字模型可能是一个不好的想法,我承认我自己对这个解决方案也有些犹豫。然而,在尼古拉的回复中的其中一个链接中,作者讨论了单线程/套接字模型,并链接到了一篇非常有趣的论文,我想在这里将它链接上,因为它打破了我关于线程与事件驱动模型之间区别的很多错误观念:为什么事件驱动是一个坏主意