加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails环回请求导致死锁?

发布时间:2020-12-17 03:22:36 所属栏目:百科 来源:网络整理
导读:解 我正在开发模式中切换到独角兽.需要一个针对每个递归级别的工作进程来防止死锁情况,因此我运行了2个工作进程. 问题 我正在开发环境中使用Thin服务器.我使用端口3000(dev环境中的默认值).我的问题是让服务器向自己发出请求. 假设我有以下控制器: # app/co

我正在开发模式中切换到独角兽.需要一个针对每个递归级别的工作进程来防止死锁情况,因此我运行了2个工作进程.

问题

我正在开发环境中使用Thin服务器.我使用端口3000(dev环境中的默认值).我的问题是让服务器向自己发出请求.

假设我有以下控制器:

# app/controllers/recursions_controller.rb
class RecursionsController < ApplicationController

    # /recursions
    def index

        # synchronously call recursions#show
        RestClient.get("http://localhost:3000/recursions/1") 

        # finish!
        render :text => 'index'

    end

    # /recursions/:id
    def show

        # finish immediately
        render :text => 'show'

    end

end

这是相应的路线:

# config/routes.rb
resources :recursions

这是我最初请求递归时索引日志的输出#index:

[INFO] 2013-01-15 12:09:05 -0800 Started GET "/recursions" for 127.0.0.1 at 2013-01-15 12:09:05 -0800
Processing by RecursionsController#index as HTML
Completed 500 Internal Server Error in 60049ms

[FATAL] 2013-01-15 12:10:05 -0800 RestClient::RequestTimeout (Request Timeout):
  app/controllers/recursions_controller.rb:8:in `index'
  Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.11/lib/action_dispatch/middleware/templates/rescues/_trace.erb (0.8ms)
  Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.11/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.7ms)
  Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.11/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (7.4ms)

[INFO] 2013-01-15 12:10:05 -0800 

[INFO] 2013-01-15 12:10:05 -0800 

[INFO] 2013-01-15 12:10:05 -0800 Started GET "/recursions/1" for 127.0.0.1 at 2013-01-15 12:10:05 -0800
Processing by RecursionsController#show as XML
  Parameters: {"id"=>"1"}
  Rendered text template (0.0ms)
Completed 200 OK in 7ms (Views: 5.5ms)

我怀疑这里发生的是某种僵局.请求A在请求B返回之前无法返回(递归排序,无法帮助),但是在请求A返回之前无法处理请求B(我的网络服务器内置了明显的限制?).当RestClient超时时会解决死锁,导致异常,并以500结束请求A.只有这样才能处理请求B,尽管此时此处没有实际意义.

在我看来,我的网络服务器无法处理并发请求.那就是说,这是我的问题:

>我可以在我的开发环境中切换到不受限制的网络服务器吗?我们在生产中使用Unicorn,它可以产生多个工作进程,因此处理并发请求,但Unicorn对于开发环境来说似乎太重了.使Unicorn成为我的问题的解决方案的同样的事情可能使得难以读取日志输出.这是我最后的解决方案.
>是否有一种棘手的方式向Rails / Rack框架发出请求以绕过明显的并发请求限制?
>任何人都可以向我提供明确说明这种情况的文档吗?我不知道它是否是所有单进程Ruby on Rails webservers固有的限制,或者只是Thin.

注意:这只是一个玩具问题,用于演示我遇到的阻塞问题.如果您需要知道实际原因,那就是我将一些HTTP服务从我们基础架构的另一部分移动到我们的RoR应用程序中.我们的RoR应用程序在我们的代码中的许多不同点消耗这些服务,所以我试图保持这些服务的客户端代码不变,只改变实现.这意味着发出循环HTTP请求.这将在以后优化,一切都稳定下来.

解决方法

您是正确的,默认情况下,您的应用程序一次只会处理一个请求.这个限制是由Rack :: Lock中间件实现的 – 无论你使用什么网络服务器,它都会存在.

你可以通过调用config.thread_safe来改变它!在适当的environment.rb文件中.但是,rails的开发模式代码重新加载不是线程安全的,并且被此设置禁用,这使得它在开发中不能真正使用.究竟是什么config.thread_safe!在rails configuration guide中描述了什么.

乘客,战俘,独角兽都可以轻松运行多个实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读