gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:45:59 25 4
gpt4 key购买 nike

解决方案

我正在开发模式下切换到 unicorn 。每一级递归都需要一个工作进程来防止死锁情况,所以我正在运行 2 个工作进程。

问题

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

假设我有以下 Controller :

# 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

这是我最初请求 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)

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

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

  • 注:这只是一个演示我遇到的阻塞问题的玩具问题。如果你想知道这个的真正原因,那是我将一些 HTTP 服务从我们基础设施的另一部分移动到我们的 RoR 应用程序中。我们的 RoR 应用程序在代码中的许多不同点使用这些服务,所以我试图让这些服务的客户端代码保持不变,只更改实现。这意味着发出循环 HTTP 请求。这将在以后一切稳定后进行优化。

    最佳答案

    您是正确的,默认情况下您的应用一次只会处理一个请求。此限制由 Rack::Lock 实现。中间件 - 无论您使用什么网络服务器,它都会在那里。

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

    乘客、战俘、 unicorn 都可以轻松运行多个实例。

    关于ruby-on-rails - Ruby on Rails 环回请求导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14346311/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com