我有一个应用程序,使用多线程同时执行30个独立的任务,每个任务通过http检索数据,执行计算并将结果返回给ui线程。
我可以使用TPL执行相同的任务吗?
TPL是创建30个新线程并将它们分布到所有可用核心上,还是只是将任务分割到可用核心上并使用一个线程每个核心?
在这种情况下,使用TPL会提高性能吗,而不是使用多线程?
我有一个应用程序,使用多线程同时执行30个独立的任务,每个任务通过http检索数据,执行计算并将结果返回给ui线程。
我可以使用TPL执行相同的任务吗?
TPL是创建30个新线程并将它们分布到所有可用核心上,还是只是将任务分割到可用核心上并使用一个线程每个核心?
在这种情况下,使用TPL会提高性能吗,而不是使用多线程?
有很多关于并发级别的帖子,我碰到过一个在这里。
有没有什么原因不能使用异步Web获取?我怀疑在这里没有必要为每个任务或甚至每个内核使用一个线程。 TPL使异步编程的各个方面变得更加容易,例如连续性。
就效率而言,您的应用程序实际上是CPU限制吗?听起来,您需要在网络端获得最大适当级别的并行性 - 这是要关注的部分,除非计算真的很重。
上面的答案一如既往地很好,但可能会误导,因为它没有 .NET 4.0 CLR 中的一些重要更改。
正如 Andras 所说,当前的 TPL 实现使用线程池,因此将使用所需的线程数(核心数量现在不再相关):
任务并行库(TPL)是一组新类,专门设计用于在现代硬件上更轻松、更高效地执行非常细粒度的并行工作负载。TPL 已经作为 CTP 单独提供了一段时间,并包含在 Visual Studio 2010 CTP 中,但在这些版本中,它 是 建立在自己的 专用工作调度程序 上的。对于 CLR 4.0 Beta 1,TPL 的默认调度程序将是 CLR 线程池,这允许 TPL 样式的工作负载与现有的基于 QUWI 的代码“友好相处”,并允许我们重用线程池中的大部分底层技术 - 特别是线程注入算法,我们将在未来的文章中讨论。
来源:
let fetchCalcAndPost uris calc post =
for uri in uris do
async { use client = new System.Net.WebClient()
let! data = client.AsyncDownloadString uri
do calc data |> post }
|> Async.Start
这个解决方案不会阻塞任何线程,因此是完全并发的。
你是否生成了30个线程?你是否使用了线程池?我相信TPL会更加优化。生成线程是一项相当昂贵的操作。我同意Jon的观点,TPL通常会使用每个核心一个线程。顺便问一下,我们在谈论哪个.NET版本。