2014-09-25 68 views

回答

11

快速回答:异步工作流是轻量级的用户空间线程。您可以创建大量这样的异步工作流程,这可以帮助您以更自然的方式构建您的程序,假设它具有异步,并行或并行计算。一个本地线程可以运行任意数量的异步工作流,异步工作流可以从一个本地线程转移到另一个本地线程。这使您的程序能够有效且高效地使用本机线程。

异步工作流的基本特性是异步工作流中的操作可以被阻塞,等待长时间运行(异步)操作的结果而不会阻塞本地线程。这允许单个本地线程运行多个异步工作流(一次一个)。

在您链接的特定示例中,Async.Parallel用于并行执行多个长时间运行的操作。使用异步工作流程使得程序的并行化版本结构简单,同时避免使用多个(昂贵的)本地线程。 所以,答案是否定的:这不会创建大量原生线程,只需等待即可。会发生什么是(相对)少量的本地线程将运行这些异步工作流程。当特定的异步工作流程被阻塞时,等待长时间运行的操作,本地线程开始运行一些其他异步工作流程,以准备继续。

关于并行编程,特别是异步工作流程存在问题。具体而言,异步工作流程以(半)抢先方式执行。基本上,执行异步工作流程是为了在执行一些操作之后,即使特定的异步工作流程没有阻塞或等待长时间运行的操作,也会排队,而另一个工作流程则被排队等待执行。这对于并行性能而言是灾难性的,因为这意味着您的程序将使用与就绪工作流数量成正比的内存,这可能比CPU内核数量大得多。为了最大化并行性能,最好使用协作调度。这是我为F#创建Hopac库的原因之一。 OK。

+0

OK。然后,这与C#中的不同之处在于,如果您创建大量运行异步IO操作并执行大量等待的任务,则实质上是浪费线程。 – user3410575 2014-09-25 15:39:50

+1

正确,我指的是C#5之前的版本,应该提到这一点。但是为了确认,F#异步工作流给出了与线程保存异步等待相同的好处,对吗? – user3410575 2014-09-25 15:46:23

+1

为您的'关于并行编程'段落+1。如果可以的话,它将是+100,因为它简洁而有效地描述了许多人似乎误解的问题。 – ildjarn 2014-09-25 19:09:21