我试图完全理解Rack中并发请求处理的选项.我已经使用async_sinatra构建了一个长轮询应用程序,现在正在使用throw :async
和/或Thin的线程标志对裸机Rack 进行试验.我对这个话题很熟悉,但有些事情我就是搞不懂.(不,我没有把并发误认为并行,是的,我确实理解GIL施加的限制).
问题1.我的测试表明,thin --threaded
个(即rack.multithread=true
个)在不同的线程中并发运行请求(我假设使用EM),这意味着长时间运行的请求A不会阻止请求B(IO除外).这意味着我的应用程序不需要任何特殊编码(例如回调)来实现并发性(同样,忽略阻止DB调用、IO等).This is what I believe I have observed - is it correct?
问题2.还有另一种更常被讨论的实现并发性的方法,涉及EventMachine.defer
和throw :async
.严格来说,请求是使用线程处理的.它们是串行处理的,但会将繁重的任务和回调传递给使用async的EventMachine.回调以稍后发送响应.请求A将其工作卸载给EM.DEREF后,请求B开始.Is this correct?
问题3.假设上面的说法或多或少是正确的,那么显然--threaded
看起来像一颗神奇的子弹.有什么缺点吗?如果不是,为什么每个人都在谈论async_sinatra
/throw :async
/async.callback
?也许前者是"我想让我的Rails应用程序在重载情况下更快速",而后者更适合于有许多长时间运行请求的应用程序?或者规模是一个因素?只是猜猜而已.
我在Ruby 1.9.2上运行精简版1.2.11.(仅供参考,我必须使用--no-epoll
标志,因为EventMachine使用epoll和Ruby 1.9.2时有a long-standing, supposedly-resolved-but-not-really problem个标志.这不重要,但欢迎有任何见解.)