2014-09-25 33 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