我应该将Task封装在类中吗
本文关键字:封装 Task 我应该 | 更新日期: 2023-09-27 18:21:36
我正在构建一个具有多个长时间运行的工作线程的应用程序,这些线程需要全天候运行。每个worker都是一个名为Bot
的类中的一个方法。Bot
的启动/停止由类本身控制。因此,如果我需要运行10个机器人,我只需要实例化10个Bot
,存储在List<Bot>
中,并启动其中的每个机器人。我还有一个BotManager
类来管理所有当前运行的Bot
现在,我想为每个工人使用Task
而不是Thread
,因为他们只花不到5%的时间进行任何处理。
我应该在每个类中保留一个Task
,还是应该从Task
继承我的Bot
?
我不会从Task
下降。你并没有真正扩展"任务"的概念,并制作一些对使用它的代码来说是具有额外功能的任务;相反,你只是在做一些碰巧使用任务来实现它的事情。
我也不确定Task
是否适合这里。如果这个想法是让这些在后台运行,那么这并不能发挥TPL的优势。使用Task
的最佳时机是当您需要可组合性时——一个定义良好的任务,它运行、完成,然后通知其他任务它已经完成,他们可以开始处理它的结果。
据我所知,您的需求是运行尽可能多的线程来优化CPU使用率。同时,您希望框架负责根据CPU使用情况增加和减少当前运行的线程。
我认为TPL(任务)是更好的选择。请调查http://msdn.microsoft.com/en-us/library/dd537609.aspx
如果您分享您想要并行执行的工作的性质,我们可以为您提供更多帮助。你所说的全天候运行任务到底是什么意思?你的任务是做什么样的工作?是计算还是IO(数据库操作/Web服务调用)?
我假设每个请求由4个步骤组成,并且这些步骤按以下顺序执行,1.数据库查找2.Web服务调用3.数据库更新4.记录到文件
正如您提到的,Web服务调用需要时间,因此最适合异步I/O任务。
接下来你说
CPU密集型部分将是数据库查找
但我知道数据库查找不使用CPU,它是一种I/O活动,也是异步I/O任务的好候选者。
考虑到所有这些假设,我建议如下
- DB查找(异步运行,以便释放线程池线程来处理其他请求)
- Web服务调用(异步运行,以便释放线程池线程来处理其他请求)
- 数据库更新(同步运行)
- 日志到文件(根据日志内容大小使用异步日志记录)
根据我的理解,你的步骤都不是CPU密集型的,这就是为什么你只看到5%的CPU使用率。
你还提到,
随后是随机延迟以均匀地分配负载。
您是否打算运行尽可能多的此类请求(由这4个步骤组成)?如果是这样的话,那么你就不需要放任何额外的东西了。因为当一个请求等待异步调用时,它会释放线程池线程,系统可以使用它来处理其他请求。这将提高吞吐量。
我应该在每个类中保留一个Task,还是应该从任务
1个Bot代表1个请求。任务表示请求中的步骤。因此,在BOT类中创建任务。
使用不同数量的请求运行它,并验证CPU、内存和其他系统资源的使用情况。
这绝对不是任务的"任务"。使用螺纹。当您需要确保您的代码实际上正在运行(并且在固定数量的线程上)时,不能使用任务。任务不能保证并行执行。您必须自己分配线程。如果您想节省资源,请使用构造函数来减少线程堆栈大小。