问题描述
在 MRI 上,有一个全局 VM 锁 (GVL),可确保一次只有一个线程可以运行 Ruby 代码。但是,如果您正在执行大量阻塞 IO(例如对 Twitter 等外部 API 的 HTTP 调用),Puma 仍会通过允许并行等待 IO 来提高 MRI 的吞吐量。
遗憾的是,它没有解释提高 MRI 吞吐量的机制。
我知道 MRI would release the GIL when calling system IO,但这是 MIR 而不是 Puma 的改进。
我想知道 Puma 如何改进并行阻塞 IO。
任何参考将不胜感激。
解决方法
Puma 正在使用 reactor pattern。自 Puma 4.0.0 起,Puma 使用 nio4r 进行事件处理,这意味着它可以利用本机后端,如 epoll 和 kqueue(通过 libev)。 (在 JRuby 上,nio4r 支持 java.nio)。