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

相关文章
相关标签/搜索