如何处理多个任务请求.从资源管理的角度来看,运行处理

本文关键字:处理 资源管理 运行 请求 何处理 任务 | 更新日期: 2023-09-27 17:54:13

我有一些代码需要"触发并忘记",因为调用代码不需要等待响应。

如果我要迭代一个循环并在一秒钟内调用它10,000次,我会有10,000个线程四处浮动,争夺资源吗?我做了一个噩梦,梦见我的机器突然慢下来。

或者,线程池是否管理这些请求,并将它们排队以供解析?

换句话说,用Task.Run()做蠢事是多么容易啊。

如何处理多个任务请求.从资源管理的角度来看,运行处理

因此,当您调用Task.Run时,它将创建一个新的Task并将其调度到TaskScheduler.Default上。这恰好是ThreadPoolTaskScheduler,然后将该任务排队到ThreadPoolThreadPool使用一个线程池(令人惊讶)来缓慢地遍历工作项。ThreadPool在内部管理自己的线程,并且可以在需要的时候创建更多的线程。

对于你的问题:

我会有10,000个线程四处浮动,争夺资源吗?

不,ThreadPool通常知道如何有效地管理它的线程,并且增长非常缓慢。

但是,您分配许多任务,这些任务将在那里等待占用空间,直到完成。它们还可能持有占用资源的其他引用(通常是因为捕获)。
顺便说一下,如果不是更安全的Task.Run,您将使用Task.Factory.StartNew并传递TaskCreationOptions.LongRunning,那么创建10,000个后台线程。

当你调用Task时。运行时,您正在排队等待在线程池中运行的工作。如果开始一堆工作,由于计算资源有限,可能需要一段时间才能完成。使用Task.Run运行后台任务时很容易咬自己。最好是了解情况并为工作使用正确的工具。如果你想处理大量的后台工作,可以看看TPL、BlockingCollection和Concurrent Collections。像生产者/消费者流这样的东西是正确的方向,但这一切都取决于你想要解决的问题。