gpt4 book ai didi

C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL

转载 作者:IT王子 更新时间:2023-10-29 04:14:34 24 4
gpt4 key购买 nike

我最近阅读了很多关于线程的书籍,因为我正在寻求开发一个高性能、可扩展的 TCP 服务器,该服务器能够处理多达 10,000-20,000 个客户端,其中每个客户端始终通过一个线程与服务器进行双向通信基于命令的系统。服务器将接收命令,并根据命令执行单个(或多个)任务。我的问题是如何在各种情况下适本地使用 .NET 线程结构,执行可能需要一分钟到几小时的任务,具体取决于正在执行的工作。

最让我困惑的是,无论我读到什么,我都会看到类似“使用手动创建的线程(或自定义线程池)来处理‘长时间运行’的任务,并使用 TPL 来处理短期任务,或需要并行处理的任务。”什么是长时间运行的任务? 到底是什么?那是 5 秒、60 秒还是一个小时?

我应该在什么时间范围内使用这三种创建线程的方法:

  • 手动创建线程
  • .NET 线程池类
  • TPL

我考虑过的另一个问题如下——假设我的服务器实际上连接了 20,000 个客户端,每个客户端每秒发送 1 个命令(可以转换为一个或多个任务)。即使使用强大的硬件,我是否有可能将过高的工作负载插入我拥有的任何线程池/工作项队列,从而在队列缓慢填充到最大值后最终生成 OutOfMemoryException?

如有任何见解,我们将不胜感激。

最佳答案

实际上,对于那种情况,所有都是次要的;您首先应该看的是 asyc-IO,又名 .BeginRead(...) 等;这允许您通过等待 IO 完成端口来最小化线程数量 - 效率更高。

一旦你有一个完整的消息,在那个规模我会把消息扔到一个自定义的线程池/同步队列中。我将控制数量的常规线程(不是池线程或 IOCP)为该队列提供服务以处理每个项目。

碰巧我现在正在做类似的事情(规模较小);为了防止内存爆炸,我已经限制了工作队列;如果它已满(即工作人员无法跟上),那么您可能会暂时阻塞 IOCP,也许最终超时会告诉客户端在 IOCP 层“太忙”。

关于C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5288568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com