相关疑难解决方法(0)

MRI Ruby的并发请求

我把一个简单的例子放在一起,尝试使用一个基本的例子来证明Rails中的并发请求.请注意,我使用的是MRI Ruby2和Rails 4.2.

  def api_call
    sleep(10)
    render :json => "done"
  end
Run Code Online (Sandbox Code Playgroud)

然后我在我的Mac(I7/4 Core)上的Chrome中找到4个不同的选项卡,看看它们是以串行还是并行方式运行(真正并发的是关闭但不是同一个东西).即,http:// localhost:3000/api_call

我不能使用Puma,Thin或Unicorn来使用它.每个请求都是串联的.10秒之后的第一个标签,20之后的第二个标签(因为它必须等待第一个完成),之后是第三个....

从我所读到的,我相信以下是真实的(请纠正我)并且是我的结果:

  • Unicorn是多进程的,我的例子应该有效(在定义unicorn.rb配置文件中的worker数量之后),但事实并非如此.我可以看到4名工人开始,但一切都在串联.我正在使用unicorn-rails gem,使用unicorn -c config/unicorn.rb启动rails,在我的unicorn.rb中我有:

- unicorn.rb

worker_processes 4
preload_app true
timeout 30
listen 3000
after_fork do |server, worker|
  ActiveRecord::Base.establish_connection
end
Run Code Online (Sandbox Code Playgroud)
  • Thin和Puma是多线程的(虽然Puma至少有一个' 集群 '模式,你可以使用-w参数启动worker)并且不应该使用MRI Ruby2.0无论如何(在多线程模式下),因为"有一个全局解释器锁(GIL)确保一次只能运行一个线程".

所以,

  • 我有一个有效的例子(或使用睡眠错误)?
  • 我上面关于多进程和多线程(关于MRI Rails 2)的陈述是否正确?
  • 关于为何我无法使用Unicorn(或任何服务器)的任何想法?

有一个非常类似的问题,但是我无法解决这个问题并且它没有回答我关于使用MRI Ruby的并发请求的所有问题.

Github项目:https://github.com/afrankel/limitedBandwidth(注意:项目正在考虑的不仅仅是服务器上的多进程/线程问题)

ruby multithreading ruby-on-rails multiprocessing ruby-on-rails-4

26
推荐指数
1
解决办法
3743
查看次数