如何处理多个任务请求.从资源管理的角度来看,运行处理
本文关键字:处理 资源管理 运行 请求 何处理 任务 | 更新日期: 2023-09-27 17:54:13
我有一些代码需要"触发并忘记",因为调用代码不需要等待响应。
如果我要迭代一个循环并在一秒钟内调用它10,000次,我会有10,000个线程四处浮动,争夺资源吗?我做了一个噩梦,梦见我的机器突然慢下来。
或者,线程池是否管理这些请求,并将它们排队以供解析?
换句话说,用Task.Run()
做蠢事是多么容易啊。
因此,当您调用Task.Run
时,它将创建一个新的Task
并将其调度到TaskScheduler.Default
上。这恰好是ThreadPoolTaskScheduler
,然后将该任务排队到ThreadPool
。ThreadPool
使用一个线程池(令人惊讶)来缓慢地遍历工作项。ThreadPool
在内部管理自己的线程,并且可以在需要的时候创建更多的线程。
对于你的问题:
我会有10,000个线程四处浮动,争夺资源吗?
不,ThreadPool
通常知道如何有效地管理它的线程,并且增长非常缓慢。
顺便说一下,如果不是更安全的
Task.Run
,您将使用Task.Factory.StartNew
并传递TaskCreationOptions.LongRunning
,那么将创建10,000个后台线程。 当你调用Task时。运行时,您正在排队等待在线程池中运行的工作。如果开始一堆工作,由于计算资源有限,可能需要一段时间才能完成。使用Task.Run运行后台任务时很容易咬自己。最好是了解情况并为工作使用正确的工具。如果你想处理大量的后台工作,可以看看TPL、BlockingCollection和Concurrent Collections。像生产者/消费者流这样的东西是正确的方向,但这一切都取决于你想要解决的问题。