监听多个套接字:选择与多线程

Posted

技术标签:

【中文标题】监听多个套接字:选择与多线程【英文标题】:Listening to multiple sockets: select vs. multi-threading 【发布时间】:2012-01-27 21:19:25 【问题描述】:

服务器需要监听来自多个套接字 (10-20) 的传入数据。在一些初始化之后,这些套接字被创建并且不会改变(即不接受新的套接字,并且在服务器的生命周期内它们都不会关闭)。

一种选择是在所有套接字上select(),然后处理每个套接字的传入数据(即路由到适当的处理函数)。

另一种选择是为每个套接字打开一个线程,让每个线程recv() 处理输入。

(第一个选项有设置超时的好处,但在这种情况下这不是问题, 因为所有的套接字都非常活跃)。

假设以下情况:Windows 服务器有足够的内存,20MB(对于 20 个线程)不是问题,这些选项中的任何一个是否会比另一个更快?

【问题讨论】:

我认为对于 10-20 个套接字,为每个套接字分配一个线程不是问题,并且使用“recv()”进行处理通常会更快编程(afaik)。另请参阅此讨论以获取更多意见:gamedev.net/topic/304030-async-sockets-or-select-with-threads 【参考方案1】:

在您的应用中没有太多内容。通常,使用每套接字线程比异步方法更容易,因为它的整体结构更简单,更容易维护状态。

【讨论】:

此外,网络速度不受此选择的影响。这是一个关于 CPU 和内存效率的选择。

以上是关于监听多个套接字:选择与多线程的主要内容,如果未能解决你的问题,请参考以下文章

多端口监听套接字linux

redis线程模型

eventfd,添加写入套接字的值

python多线程和套接字连接问题

你好,博客园!!第一弹~局域网下的简易聊天室,socket与多线程简结

有没有办法让多个进程共享一个监听套接字?