关于多线程编程和PLINQ的实例

时间:2022-10-07 18:31:24
好久没有发帖了。

我写了大量多线程程序,采用过各种手段来同步线程操作结果。实际上当不太要求非常高性能时,我们可以使用 PLINQ。因为它足够简单!

我举一个例子,假设我要访问csdn的.net论坛的首页列表,找出所有首页上的帖子中、有sp1234回帖(或者发帖)的,那么顺序依次查找每一个帖子,和并发查找帖子相比,慢多少呢?

大家可以自己做一个测试(使用 System.Diagnostics.Stopwatch)。我这里只是把测试代码写出来:

首先需要下载  Html Agility Pack,因为这里使用它分析 html 页面。在引用了它的dll并且在代码中using了它的命名空间之后,测试代码如下
var titles = from row in GetHtml("http://bbs.csdn.net/forums/DotNET/").DocumentNode.SelectSingleNode("//table[@class='table_list parent_forum ']").Elements("tr").Skip(1)
                let td = row.Element("td")
                where td != null
                let a = td.Descendants("a").FirstOrDefault()
                where a != null
                select new
                {
                    href = a.Attributes["href"].Value,
                    text = a.InnerText
                };
var pages = from t in titles.AsParallel().WithDegreeOfParallelism(64)
            where t.href != null
            let path = "http://bbs.csdn.net" + t.href
            let subQuery = from nick in GetHtml(path).DocumentNode.SelectNodes("//span[@class='name2nick']")
                            where nick.InnerText == "sp1234"
                            select nick
            where subQuery.Any()
            select new
            {
                title = t.text,
                href = path
            };
var results = pages.ToList();


当你将 
from t in titles.AsParallel().WithDegreeOfParallelism(64)
 改为简单的 
from t in titles
时,可以测试一下顺序执行需要多少时间。

我对c# 4.5的 Async 和Await 相当有意见,我认为它把非常简单和琐碎的事情给“搞砸了”,它使得许多程序员忘记了多线程编程的基本概念,因此应该尽量避免使用这两个让人“傻瓜化”的关键字。但是我对 PLINQ 如此强大和简单却非常敬佩,因为它不是针对简单和琐碎的事情,而是直接改变了非常复杂的编程工作,只有这个场景下才体现出“傻瓜化”的真正好处。

80 个解决方案

#1


其中一个读取网页返回html分析结果的方法在这里:
static HtmlDocument GetHtml(string url)
{
    var content = Encoding.UTF8.GetString(new WebClient().DownloadData(url));
    var doc = new HtmlDocument();
    doc.Load(new StringReader(content));
    return doc;
}


简单解释一下Linq中的查询逻辑:
   GetHtml("http://bbs.csdn.net/forums/DotNET/")   读取了net论坛列表首页
   .DocumentNode.SelectSingleNode("//table[@class='table_list parent_forum ']") 找到页面内的帖子列表
   .Elements("tr").Skip(1) 遍历每一个tr行,但是跳过第一行标题
     row.Element("td").Descendants("a").FirstOrDefault()  找到行内第一个a(帖子标题)


   .DocumentNode.SelectNodes("//span[@class='name2nick']")  找到页面内所有昵称部分
   subQuery.Any()  判断是否存在 sp1234 这个昵称。

#2


嗯,google不能访问的话,下载 html 分析工具可以访问下载页: http://htmlagilitypack.codeplex.com/releases/view/90925

#3


该回复于2013-04-10 09:26:59被管理员删除

#4


不常见你发帖。。。

#5


感谢分享啊, 关于多线程编程和PLINQ的实例

#6


关于多线程编程和PLINQ的实例

#7


前提是 对性能没有要求,其实就等价于new了N个同步线程
真正高效的多线程类库应该是 基于流水线设计的

#8


顶一下 关于多线程编程和PLINQ的实例

#9


如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles
 

#10


PLINQ是保守的,如果并行可以提高查询速度,则可并行运行,如果不是,他还是会选择顺序查询

PS:确实很少看见你发帖子

#11


引用 9 楼 q107770540 的回复:
如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles

我觉得是

#12


关于多线程编程和PLINQ的实例

#13


该回复于2013-04-10 10:05:45被管理员删除

#14


技术NB 发帖时间更NB

#15


相当经典,不错哦

#16


多谢分享,很有收获

#17


引用 9 楼 q107770540 的回复:
如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles

如果是CPU运算,只会更慢。如果是IO,就不同了。

#18


多谢分享 关于多线程编程和PLINQ的实例

#19


顶一下 关于多线程编程和PLINQ的实例

#20


多谢分享 关于多线程编程和PLINQ的实例

#21


高手真多我是新手!

#22


该回复于2013-04-10 13:19:34被管理员删除

#23


在C/S架构中   PLINQ的优势不言而喻.

#24


关于多线程编程和PLINQ的实例终于见p哥发言了 ,特地登陆上来留个名

#25


关于多线程编程和PLINQ的实例终于见p哥发言了 ,特地登陆上来留个名

#26


看帖回帖,尤其技术贴

#27


该回复于2013-04-11 08:51:29被管理员删除

#28


我只希望能得一点sp的分,lz不要让我失望。

#29


mark一下,不知道以后用不用得到

#30


关于多线程编程和PLINQ的实例

#31


再顶一下p哥

#32


下载了,感谢分享!

#33


多谢分享 关于多线程编程和PLINQ的实例

#34


引用 14 楼 new_fengzi 的回复:
技术NB 发帖时间更NB
关于多线程编程和PLINQ的实例

#35


技术NB 发帖时间更NB   

#36


来沾一点儿P哥的仙气~~

#37


该回复于2013-04-12 08:55:23被管理员删除

#38


看看微软的说法:http://technet.microsoft.com/zh-cn/library/dd997399  

#39


lz不要让我失望

#40


继续观察。。

#41


我是纯粹来膜拜LZ的

#42


NX啊,老大

#43


真心不经常见啊 主要是我也不经常来哦
不过google不能访问的话,下载 html 分析工具可以访问下载页:http://www.chinafanli.com/index.php?mod=article&act=list&cid=515

#44


该回复于2013-04-14 10:44:14被管理员删除

#45


该回复于2013-04-15 09:05:50被管理员删除

#46


关于多线程编程和PLINQ的实例

#47


关于多线程编程和PLINQ的实例ok thank you

#48


崇拜,相当崇拜!

#49


关于多线程编程和PLINQ的实例多谢分享

#50


该回复于2017-05-01 00:03:28被版主删除

#1


其中一个读取网页返回html分析结果的方法在这里:
static HtmlDocument GetHtml(string url)
{
    var content = Encoding.UTF8.GetString(new WebClient().DownloadData(url));
    var doc = new HtmlDocument();
    doc.Load(new StringReader(content));
    return doc;
}


简单解释一下Linq中的查询逻辑:
   GetHtml("http://bbs.csdn.net/forums/DotNET/")   读取了net论坛列表首页
   .DocumentNode.SelectSingleNode("//table[@class='table_list parent_forum ']") 找到页面内的帖子列表
   .Elements("tr").Skip(1) 遍历每一个tr行,但是跳过第一行标题
     row.Element("td").Descendants("a").FirstOrDefault()  找到行内第一个a(帖子标题)


   .DocumentNode.SelectNodes("//span[@class='name2nick']")  找到页面内所有昵称部分
   subQuery.Any()  判断是否存在 sp1234 这个昵称。

#2


嗯,google不能访问的话,下载 html 分析工具可以访问下载页: http://htmlagilitypack.codeplex.com/releases/view/90925

#3


该回复于2013-04-10 09:26:59被管理员删除

#4


不常见你发帖。。。

#5


感谢分享啊, 关于多线程编程和PLINQ的实例

#6


关于多线程编程和PLINQ的实例

#7


前提是 对性能没有要求,其实就等价于new了N个同步线程
真正高效的多线程类库应该是 基于流水线设计的

#8


顶一下 关于多线程编程和PLINQ的实例

#9


如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles
 

#10


PLINQ是保守的,如果并行可以提高查询速度,则可并行运行,如果不是,他还是会选择顺序查询

PS:确实很少看见你发帖子

#11


引用 9 楼 q107770540 的回复:
如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles

我觉得是

#12


关于多线程编程和PLINQ的实例

#13


该回复于2013-04-10 10:05:45被管理员删除

#14


技术NB 发帖时间更NB

#15


相当经典,不错哦

#16


多谢分享,很有收获

#17


引用 9 楼 q107770540 的回复:
如果我的客户端机器是单核的CPU,那么对于这两句在运行时间上应该是没有区别的,P哥?



from t in titles.AsParallel().WithDegreeOfParallelism(64)
 
 改为简单的 


from t in titles

如果是CPU运算,只会更慢。如果是IO,就不同了。

#18


多谢分享 关于多线程编程和PLINQ的实例

#19


顶一下 关于多线程编程和PLINQ的实例

#20


多谢分享 关于多线程编程和PLINQ的实例

#21


高手真多我是新手!

#22


该回复于2013-04-10 13:19:34被管理员删除

#23


在C/S架构中   PLINQ的优势不言而喻.

#24


关于多线程编程和PLINQ的实例终于见p哥发言了 ,特地登陆上来留个名

#25


关于多线程编程和PLINQ的实例终于见p哥发言了 ,特地登陆上来留个名

#26


看帖回帖,尤其技术贴

#27


该回复于2013-04-11 08:51:29被管理员删除

#28


我只希望能得一点sp的分,lz不要让我失望。

#29


mark一下,不知道以后用不用得到

#30


关于多线程编程和PLINQ的实例

#31


再顶一下p哥

#32


下载了,感谢分享!

#33


多谢分享 关于多线程编程和PLINQ的实例

#34


引用 14 楼 new_fengzi 的回复:
技术NB 发帖时间更NB
关于多线程编程和PLINQ的实例

#35


技术NB 发帖时间更NB   

#36


来沾一点儿P哥的仙气~~

#37


该回复于2013-04-12 08:55:23被管理员删除

#38


看看微软的说法:http://technet.microsoft.com/zh-cn/library/dd997399  

#39


lz不要让我失望

#40


继续观察。。

#41


我是纯粹来膜拜LZ的

#42


NX啊,老大

#43


真心不经常见啊 主要是我也不经常来哦
不过google不能访问的话,下载 html 分析工具可以访问下载页:http://www.chinafanli.com/index.php?mod=article&act=list&cid=515

#44


该回复于2013-04-14 10:44:14被管理员删除

#45


该回复于2013-04-15 09:05:50被管理员删除

#46


关于多线程编程和PLINQ的实例

#47


关于多线程编程和PLINQ的实例ok thank you

#48


崇拜,相当崇拜!

#49


关于多线程编程和PLINQ的实例多谢分享

#50


该回复于2017-05-01 00:03:28被版主删除