Yin*_*Zhu 11 .net c# parallel-processing f#
我是.Net平台的新手.我做了一个搜索,发现有几种方法可以在.Net中进行并行计算:
任务并行库中的并行任务,即.Net 3.5.
PLINQ,.Net 4.0
Asynchounous Programming,.Net 2.0,(异步主要用于执行I/O繁重的任务,F#有一个简洁的语法支持这一点).我列出这个是因为在Mono中,似乎没有TPL或PLINQ.因此,如果我需要编写跨平台并行程序,我可以使用异步.
.Net线程.没有版本限制.
您能否对这些做一些简短评论或在此列表中添加更多方法?
Ste*_*ary 15
您需要做大量的研究才能确定如何有效地进行多线程.有一些很好的技术文章,是Microsoft Parallel Computing团队网站的一部分.
在我的脑海中,有几种方法可以解决多线程问题:
Thread
类.ThreadPool
,它还支持I/O绑定操作和I/O完成端口.Begin*
/ End*
异步操作.SynchronizationContext
.BackgroundWorker
,这是一个定义异步操作的EBAP.Task
.NET 4中的类(任务并行库).更新:有一篇文章了解和应用.NET Framework 4的并行模式可供下载,它为哪些解决方案用于哪种并行方案提供了一些指导(尽管它假定为.NET 4并且不包括Rx).
Mau*_*fer 12
严格来说,应该在这里区分并行,异步和并发.
并行意味着"任务"被分成几个可以同时运行的较小子任务.这需要一个多核CPU或多CPU计算机,其中每个任务都有其专用的核心或CPU.或多台电脑.PLINQ(数据并行)和TPL(任务并行)属于这一类.
异步意味着任务在不相互阻塞的情况下运行.F#的异步表达式,Rx,Begin/End模式都是异步编程的API.
并发是一个比并行化和异步更广泛的概念.并发意味着几个"任务"同时运行,彼此交互.但是这些"任务"不必在单独的物理计算单元上运行,就像在并行化中那样.例如,多任务操作系统甚至可以使用时间片在单核单CPU计算机上同时执行多个进程.并发可以通过例如Actor模型和消息传递来实现(例如F#的邮箱,Erlang进程(在.Net中的Retlang))
与上述概念相比,线程是一个相对低级的概念.线程是在进程内运行的任务,并行运行并由操作系统的调度程序直接管理.当操作系统通过在每个线程上实现消息队列,路由等将每个线程映射到单独的核心或Actor模型时,可以实现并行化.