什么是需要TPL库的典型问题?

时间:2012-05-26 06:01:31

标签: c# task-parallel-library

我正在阅读 Pro。在C#中使用.NET 4.0并行编程,但每章末尾没有练习。虽然我理解这个概念,但我仍然觉得缺乏一些实际的做法。我需要一些真正的问题来强化我学到的东西。我通过互联网搜索,但主要是教程...
是否存在仅针对TPL的问题集?我发现这个库在很多方面很吸引人,我只是想要它。所以我想知道是否有人可以在TPL领域与我分享一些问题,以便我可以练习我的知识。您遇到的任何问题或参考将不胜感激。我只需要问题,我会自己找到解决方案。提前谢谢。

3 个答案:

答案 0 :(得分:2)

我认为TPL与可扩展性有关。如果以这种方式考虑它,您将找到在代码中使用它的方法。如果没有并行完成 - 它是按顺序完成的。在一个行动很少的小应用程序中 - 顺序处理很棒。但是,当您有数千个特定流程请求时 - 这就是TPL的用武之地。

假设您要处理请求列表。在请求中是网站的URL。该过程是下载HTML内容并从页面中提取特定数据并将其存储在数据库中。通常,这必须按顺序进行。现在想象10个人同时执行此请求。最后按下提交按钮的人必须等到他之前的所有其他人都完成处理。这可能需要很长时间并且无限增加。

视觉表现:

[Request01] - Finished 
[Request02] - Started
[Request03] - Waiting
[Request04] - Waiting
[Request05] - Waiting
[Request06] - Waiting
[Request07] - Waiting
[Request08] - Waiting
[Request09] - Waiting
[Request10] - Waiting

使用TPL - 您可以将这些请求存储在并发集合(TPL集合)中,并在Parallel中迭代集合。 TPL不仅在线程中拆分这些请求并同时运行它们,它在处理器上的每个核心上都这样做。

假设您有一台带有两个双核处理器的服务器;这个过程看起来像这样:

CPU1 Core1
  [Request01] - Finished 
  [Request02] - Started
  [Request03] - Started

CPU1 Core2
  [Request04] - Finished 
  [Request05] - Started
  [Request06] - Started

CPU2 Core1
  [Request07] - Finished 
  [Request08] - Started
  [Request09] - Started

CPU2 Core2
  [Request10] - Finished

正如您所看到的 - 这可以提高产量并减少等待时间。关于TPL的好处 - 如果你可以开发一个合理的应用程序,可扩展性将从软件中退回到硬件上 - 这很棒。观众对此服务的影响越大,您投入的服务器就越多。在IT世界 - 这是更可接受的。每个人都愿意扩大硬件规模;没有人想更新他们的软件。

我希望这有助于指明你正确的方向!

答案 1 :(得分:1)

我不认为有一些特殊问题集只能通过TPL解决。

  

TPL的目的是通过简化向应用程序添加并行性和并发性的过程来提高开发人员的工作效率。 TPL动态地扩展并发度,以最有效地使用所有可用的处理器。通过使用TPL,您可以最大限度地提高代码的性能,同时专注于您的程序旨在完成的工作

这是来自msdn的TPL的描述/目的,我认为它总结得很好;
我认为关于tpl的问题通常可以被问及多线程,并且我不确定它总是很容易判断多线程是否是性能最佳的解决方案(除了非常明显的情况,当你的代码需要时)访问独立的数据源,或类似的东西)。当您决定多线程是您问题的最佳解决方案时,没有自动方式来判断要使用多少线程以及如何在它们之间划分工作。
假设您有一个应用程序必须通过某些Web服务发送X电子邮件。你会在一个大循环中发送所有X吗?你会把它们分成单独的N个线程并在每个线程中发送X / N吗?这些问题有时只能通过试验和性能分析监控来回答,据我所知,TPL库旨在为您解决这个问题:而不是期望您做所有这些计算(也可能不会让您在每次执行时都得到相同的结果),tpl旨在动态地为你计算所需的并行度,因此,理论上至少可以在每种情况下提供最佳性能。

答案 2 :(得分:1)

我曾多次与TPL合作并发现它非常有用。根据我的经验,我遇到了以下挑战:

  1. 我正在开发一个在线支付系统。从理论上讲,每秒可能有数百到数千的付款。对于每笔付款,我不得不拨打网络服务通知服务提供商有人支付了不少钱。因为调用服务是一个IO操作,所以从站点本身调用服务是不可能的,因为我们很快就会耗尽池中的线程。这就是我决定使用作业调度程序的原因。作业定期运行并从数据库中提取待处理的付款(交易),这就是TPL闪耀的地方。一个接一个地发送数百或数千个呼叫服务非常有用。这就是我使用TPL的原因。它自动分配最佳线程数并并行调用适当的服务。正如我所说,因为Web服务调用是一个IO操作,所以在机器上分配比逻辑内核更多的线程是可以的(也许是必须的)。
  2. 另一个问题是,当您需要处理大量数据(例如可以表示为集合数组)时,IO操作不会发生,所有内容都受CPU限制。您可以使用TPL在多个cpu / core之间分配负载。在这种情况下,每个cpu核心最好有1个线程。