为什么使用 ThreadPool 比基于线程的方法有优势?
why use ThreadPool has advantages over thread-based approach?
我的教科书说:
should you need to run hundreds or thousands of concurrent I/O-bound
operations, a thread-based approach consumes hundreds or thousands of
MB of memory purely in thread overhead.
和
when running multiple long-running tasks in parallel, performance can
suffer, then a thread-based approach is better
我很困惑,非线程池线程的开销和线程池线程的开销有什么区别?与 I/O-bound 相关的开销如何?
最后,为什么基于线程的方法(例如,使用 new Thread(runMethod).Start()
)更适合长 运行 任务?
ThreadPool
可重复使用的线程数量有限。此线程用于任务(例如 Task.Run
)。执行时间较长的任务会阻塞一个线程,因此它不能被另一个 Task
重用。因此,为了始终有足够的 ThreadPool
个可用线程(例如 async/await、Parallel Linq 等),您应该为此类任务使用 ThreadPool
个独立线程。
您可以通过使用 Task.Factory.StartNew(Action, TaskCreationOptions)
(或接受 TaskCreationOptions
对象的任何其他重载)然后传入参数 TaskCreationOptions.LongRunning
来执行此操作。 LongRunning
强制一个独立于 ThreadPool
的新线程。
因此对于所有长 运行 和基于 IO 的任务,例如读取文件或数据库,您应该通过调用 Task.Factory.StartNew(() => DoAction(), TaskCreationOptions.LongRunning);
使用 ThreadPool
个独立线程。你根本不需要 new Thread(runMethod).Start()
。
ThreadPool
线程的资源效率更高,因为它们是可重用的。所以当检索 ThreadPool
个线程时,它们已经被创建了。创建新线程总是占用大量资源。它们需要注册,必须创建调用堆栈,必须复制局部变量等。这就是为什么在考虑性能时,可重用线程是更可取的选择,只要工作负载是轻量级的(short 运行)。
我的教科书说:
should you need to run hundreds or thousands of concurrent I/O-bound operations, a thread-based approach consumes hundreds or thousands of MB of memory purely in thread overhead.
和
when running multiple long-running tasks in parallel, performance can suffer, then a thread-based approach is better
我很困惑,非线程池线程的开销和线程池线程的开销有什么区别?与 I/O-bound 相关的开销如何?
最后,为什么基于线程的方法(例如,使用 new Thread(runMethod).Start()
)更适合长 运行 任务?
ThreadPool
可重复使用的线程数量有限。此线程用于任务(例如 Task.Run
)。执行时间较长的任务会阻塞一个线程,因此它不能被另一个 Task
重用。因此,为了始终有足够的 ThreadPool
个可用线程(例如 async/await、Parallel Linq 等),您应该为此类任务使用 ThreadPool
个独立线程。
您可以通过使用 Task.Factory.StartNew(Action, TaskCreationOptions)
(或接受 TaskCreationOptions
对象的任何其他重载)然后传入参数 TaskCreationOptions.LongRunning
来执行此操作。 LongRunning
强制一个独立于 ThreadPool
的新线程。
因此对于所有长 运行 和基于 IO 的任务,例如读取文件或数据库,您应该通过调用 Task.Factory.StartNew(() => DoAction(), TaskCreationOptions.LongRunning);
使用 ThreadPool
个独立线程。你根本不需要 new Thread(runMethod).Start()
。
ThreadPool
线程的资源效率更高,因为它们是可重用的。所以当检索 ThreadPool
个线程时,它们已经被创建了。创建新线程总是占用大量资源。它们需要注册,必须创建调用堆栈,必须复制局部变量等。这就是为什么在考虑性能时,可重用线程是更可取的选择,只要工作负载是轻量级的(short 运行)。