假设通过UDP实现应用程序级协议。客户端超时是必需的,因此服务器需要保持与之通信的每个客户端的状态。
还假设使用了select
。
实现多线程服务器总是最好的吗?我认为链接列表将执行相同的操作,服务器超时time=Earliest Timeout of a client- CurrentTime
。链接列表与保持客户端状态具有相同的功能,同时避免了创建新线程的开销(尽管为服务器引入了一些复杂性以维护客户端特定的超时)。
如果选择多线程,那么是否最好为新客户端调用新套接字?这将引入系统资源开销。但我认为默认的服务器套接字(bind
与服务器知名端口)会做同样的事情,因为它有缓冲区(好吧......可能不够长,可以扩展数量的客户端..)
谢谢!
答案 0 :(得分:2)
根据我的经验,当潜在的可怕同步问题等待某些事件以应用程序爆炸的正确顺序发生时,线程使代码看起来很容易看起来逻辑清晰。线程是一个非常有用的工具 - 如果您的应用程序能够充分利用您的CPU,您需要考虑线程,并且学习使用线程是学习利用分布式处理的一步(至少,我想是的。)
我的偏好是使用异步回调编写应用程序,而不是阻塞调用,并显式指示我想用来处理回调的线程。这具有以下优点:
答案 1 :(得分:1)
我不打算提出Aidan Cully没有回答的新内容,但是,看看Apache的多处理模块背后的理论:http://www.linuxquestions.org/linux/answers/Networking/Multi_Processing_Module_in_Apache
本质上,服务器被分成多个模块,并且根据需要和配置选项创建线程/进程来管理连接 - 听起来像Aidan的答案中描述的平衡,尽管Apache实现可能略有不同。
答案 2 :(得分:0)
链接列表无法扩展。
使用服务器端的链接列表逐个检查客户端并满足他们的需求对5到10个客户端来说都很好。但是当你有100时会发生什么? 1000?如果一个客户请求需要很长时间才能处理,会发生什么?
线程不只是为个人客户提供维护状态的方法。它们还提供了一种跨所有客户端同时“分发服务器资源”的方法。就好像每个客户端都有一个专用的服务器,(几乎)没有队列:客户端需要一些东西,它询问服务器,服务器回复。这是瞬间的。
另外,您可能会通过链接列表方法浪费宝贵的资源。如果除了一个客户之外什么都不想要怎么办?您将反复骑自行车超过一百个客户端,除了浪费CPU周期之外什么都不做,直到遇到 需要服务器注意的那个。
答案 3 :(得分:-1)
多线程绝对不是必须的,因为您已经提出了替代方案。我们不能真正使用总是或从不等绝对值,因为每种情况都有独特的要求和约束。
是的,为每个连接添加新的线程/套接字将消耗更多资源。听起来你需要很好地定义你需要多少个连接。然后,您可以确定是否有足够的资源。
如果资源限制不是问题,我会选择更简单的解决方案。是否更容易使用您已有的工具(即经过良好测试的函数来处理线程和套接字),而不是编写新的功能体(链表建议)?代码维护怎么样?如果将来有另一个程序员在这个项目上工作,他们会更容易理解他们已经熟悉的标准操作系统调用或链表的实现吗?