ruby的併發和並行

併發: 廚師同時接收到了2個客人點了的菜單須要處理.
順序執行: 若是隻有一個廚師,那麼他只能一個菜單接着一個菜單的去完成.
並行執行: 若是有兩個廚師,那麼就能夠並行,兩我的一塊兒作菜.html

  1. Ruby MRI爲了線程安全,用了GIL只支持單核。任什麼時候刻只有一個線程在運行:當一個Thread阻塞時(好比IO, sleep等),就會切換到另個一線程。 因此就算用了celluloid, puma自動建立多線程的,MRI下每一個進程仍是單核。
  2. 而Rubinius,JRuby則沒有GIL,支持多核(每一個線程分配一個cpu)。
  3. 若是MRI下要用多核,就要用sidekiq之類的跑多個worker進程。
  4. 單核不必定比多核慢,不少時候瓶頸不在CPU,而MRI多線程能夠保證IO併發,因此性能多是同樣的。
  5. 多進程消耗內存,並且進程間難以通訊(只能經過IO之類的)。多線程,直接共享變量(內存)。

https://ruby-china.org/topics/11248segmentfault

一旦調用外部IO操做,當前線程就會釋放CPU內核控制權,另一個線程就會得到CPU資源。安全

https://ruby-china.org/topics/23183ruby

https://draveness.me/sidekiq多線程

fiber併發和多線程併發的原理其實差很少,都是當前執行線程(纖程)在執行到外部IO調用的時候,放棄CPU控制權,讓另外一個線程(纖程)來獲取CPU。主要差別在於fiber併發只佔用1個操做系統線程,由應用程序來調度纖程;而多線程併發佔用n個操做系統線程,由Ruby VM來調度線程。併發

所以二者的性能差別主要是調度方式帶來的:纖程的場景切換很是輕量級,而多線程的場景切換代價高於纖程,所以理論上來講fiber併發性能會更好異步

 

https://segmentfault.com/a/1190000010211352ide

 

  • 阻塞IO的處理模式的方法很簡單:來一個新的鏈接,咱們就新開一個線程來處理這個鏈接,以後的操做所有由那個線程來完成。
  • 非阻塞IO的核心在於使用一個 Selector 來管理多個通道,以後能夠只用一個線程來輪詢這個 Selector,看看上面是否有通道是準備好的,當通道準備好可讀或可寫,而後纔去開始真正的讀寫,這樣速度就很快了。咱們就徹底沒有必要給每一個通道都起一個線程。

http://www.importnew.com/28021.html性能

http://20bits.com/article/an-eventmachine-tutorial操作系統

https://www.slideshare.net/KyleDrake/hybrid-concurrency-patterns

Celluloid::Proxy::Async 對象會截獲方法的調用, 而後保存到 Actor 併發對象的調用隊列中, 程序沒必要等待響應就能夠往下執行(異步). 每一個併發對象都有一個本身調用隊列, 而且按順序地一個接一個執行裏邊的方法調用.

https://tonyarcieri.com/a-gentle-introduction-to-nio4r

相關文章
相關標籤/搜索