我在网关上有一个网络应用程序。它接收和发送数据包。对于大多数人来说,我的网关充当路由器,但在某些情况下,它也可以接收数据包。
我应该有:
- 只有一个主线程
- 一个主线程 + 一个分派线程,负责将其提供给正确的流处理程序 有多少
- 线程,有多少个流
- 别的。
?
正确执行多线程处理并非易事,在许多情况下,基于选择和基于朋友的解决方案将更容易创建。
你的案例听起来很像一个典型的Unix服务守护进程。解决问题的流行方法不是使用线程,而是使用分叉。
这个想法是你的程序侦听套接字并等待连接。一旦连接到达,它就会分叉。然后,子进程继续处理连接。父进程本身只是在循环中继续并等待传入的连接。
与线程相比的优势:
- 非常简单的程序设计
- 并发没有问题
- Unix/Linux 系统的既定方法
弊:
- 当多个连接相互交互时,事情会变得复杂(您的用例听起来不像它们会)
- 在 Windows 系统上的性能损失(不是在 Unix 系统上!)
您可以在线找到许多代码示例。
我对网络应用程序了解不多,但我认为它是这样的:
- 如果您能够对请求做出异步反应,则可能只使用一个线程(如在 Node.JS 中)。如果您无法异步反应,主线程将始终阻止其他操作。
- 如果您无法对请求做出异步反应,则必须使用多个线程。但是您可以通过许多不同的方式实现这一点:您可以为每个请求创建一个线程或有限数量的线程,然后将它们分配给您的请求。
我个人的偏好是每个连接使用一个主线程和一个工作线程。没有任何上限。我假设您的服务器将像HTTP服务器一样无状态。
对于有状态服务器,您必须找出某种方法来控制线程数。