2012-02-13 139 views
3

我明白,在YARV上運行的Ruby中,線程是指併發而不是並行。我的問題是:單獨使用併發可以提高性能的情況是什麼?例如,我可以想象,在同時處理多個IO流時,併發會提高性能 - 如果一個任務很慢,那麼並不意味着堆棧中的所有下一個任務都必須等待該任務完成。我對嗎?還有其他類似的情況嗎? [hopes that YARV will ever remove the GIL]/[overhead of creating threads with the GIL]比率現在是否開始在Ruby中使用線程?併發性可以提高性能嗎?

+0

你是對的猜測 – Adrian 2012-02-13 19:57:33

+0

對於未來的讀者來說,[this](http://www.engineyard.com/blog/2010/concurrency-real-and-imagined-in-mri-threads/)的帖子是非常很有幫助。 – user2398029 2012-02-15 01:47:56

回答

5

如果您有多個任務需要等待一些不經常發生的外部刺激(例如,網絡數據變爲可用,磁盤讀取完成等),那麼併發會非常有益。如果您只是坐在在循環中,等待這些操作中的一個發生,你要麼

  1. 等待很長一段時間,一些單一的事件來完成,而另一些已經完成,正在等待着你去看看他們,或
  2. 浪費CPU能量循環數百個不同的事件,這些事件沒有被觸發,尋找實際已經觸發的事件。

併發性在設計固有事件驅動的程序時也很有用,例如等待不同的UI事件發生。在這種情況下,您可以指定響應不同UI事件觸發的任務,並且處理器可以處於休眠狀態或處理其他任務,而無需顯式等待未觸發的任務運行。只要事件發生,那些線程就可以喚醒並共享CPU處理時間。

希望這會有所幫助!

+0

感謝您的回答。我有一個更具體的問題 - 讓我們說一個應用程序執行一堆高度遞歸的樹操作。同樣,僅使用併發性,通過基於子樹大小的線程之間的「負載均衡」操作,是否可以實現更高的性能?我猜測這可能會提高性能,例如,如果一些零星的葉子需要處理不成比例的類型。但是,如果運營的時間成本縮減,例如,與葉子的數量成線性關係,性能是否會增加? – user2398029 2012-02-13 23:18:36

+1

通常,併發只能幫助你,如果操作被某些外部操作阻止,而不是如果它們花費很多時間。樹搜索中所有操作的總時間是一個常量,並且如果您將這些工作在各個線程之間進行混洗,則不太可能有所幫助。 I/O操作變得更快的原因是CPU可以在其他線程的「等待時間」內工作,基本上填補了處理時間的空白。 – templatetypedef 2012-02-14 00:25:08

+0

好的,這就是我的想法 - 非常感謝。 – user2398029 2012-02-14 00:28:22

0

Ruby模型運行良好的一種情況是當您使用Ruby驅動其他應用程序時。例如,如果你產生了,比如編譯,你可以讓一個Ruby線程處理一個外部進程。

另一件好事是,它允許您將應用程序劃分爲邏輯部分,並讓一個線程處理每個部分。這樣做只使用一個線程可能會要求您編寫更復雜的應用程序。