我已經看到了一些在F#中將async和parallel組合起來的例子。這是一個MSDN示例:http://msdn.microsoft.com/en-us/library/dd233250(v=vs.120).aspx 這不是線程的低效使用嗎?爲什麼要爲許多可能長時間運行的IO類型操作使用新線程?是不是基本上創建線程,將坐在那裏等待?異步/並行組合
Q
異步/並行組合
2
A
回答
11
快速回答:異步工作流是輕量級的用戶空間線程。您可以創建大量這樣的異步工作流程,這可以幫助您以更自然的方式構建您的程序,假設它具有異步,並行或並行計算。一個本地線程可以運行任意數量的異步工作流,異步工作流可以從一個本地線程轉移到另一個本地線程。這使您的程序能夠有效且高效地使用本機線程。
異步工作流的基本特性是異步工作流中的操作可以被阻塞,等待長時間運行(異步)操作的結果而不會阻塞本地線程。這允許單個本地線程運行多個異步工作流(一次一個)。
在您鏈接的特定示例中,Async.Parallel
用於並行執行多個長時間運行的操作。使用異步工作流程使得程序的並行化版本結構簡單,同時避免使用多個(昂貴的)本地線程。 所以,答案是否定的:這不會創建大量原生線程,只需等待即可。會發生什麼是(相對)少量的本地線程將運行這些異步工作流程。當特定的異步工作流程被阻塞時,等待長時間運行的操作,本地線程開始運行一些其他異步工作流程,以準備繼續。
關於並行編程,特別是異步工作流程存在問題。具體而言,異步工作流程以(半)搶先方式執行。基本上,執行異步工作流程是爲了在執行一些操作之後,即使特定的異步工作流程沒有阻塞或等待長時間運行的操作,也會排隊,而另一個工作流程則被排隊等待執行。這對於並行性能而言是災難性的,因爲這意味着您的程序將使用與就緒工作流數量成正比的內存,這可能比CPU內核數量大得多。爲了最大化並行性能,最好使用協作調度。這是我爲F#創建Hopac庫的原因之一。 OK。
相關問題
- 1. 異步和BackgroundWorker的組合
- 2. C# - Parallel.ForEach和異步組合
- 3. 並行和異步方法
- 4. 異步和並行處理
- 5. 並行和異步結果
- 6. 異步並行在NodeJS
- 7. 異步並行錯誤?
- 8. 從非異步方法在並行中運行異步方法
- 9. 如何異步合併多個列表
- 10. 加入/異步合併相關表
- 11. 混合併發:: parallel_for和異步任務
- 12. 差異和合並或增量同步
- 13. Linq to Sql導致組合框異步
- 14. 異步消息隊列 - 哪種組合?
- 15. 異步方法沒有並行運行
- 16. 並行運行異步任務
- 17. MVC4異步和並行執行
- 18. 並行調用Sub()異步行爲
- 19. 異步和並行執行的功能
- 20. 異步方法的並行執行
- 21. 合併sql行組
- 22. 合併行成組
- 23. 使用異步js的異步並行調用llin
- 24. 我應該實現異步並行還是異步任務
- 25. 異步結合angular2
- 26. 異步 - 並行()與函數動態數組
- 27. 將函數數組傳遞給異步並行
- 28. 並行函數調用與異步
- 29. Nodejs並行異步調用,但優先
- 30. 取消異步並行代碼
OK。然後,這與C#中的不同之處在於,如果您創建大量運行異步IO操作並執行大量等待的任務,則實質上是浪費線程。 – user3410575 2014-09-25 15:39:50
正確,我指的是C#5之前的版本,應該提到這一點。但是爲了確認,F#異步工作流給出了與線程保存異步等待相同的好處,對嗎? – user3410575 2014-09-25 15:46:23
爲您的'關於並行編程'段落+1。如果可以的話,它將是+100,因爲它簡潔而有效地描述了許多人似乎誤解的問題。 – ildjarn 2014-09-25 19:09:21