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