gpt4 book ai didi

ruby-on-rails - Rails 本地服务器同时发送和接收请求

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:25:59 24 4
gpt4 key购买 nike

所以也许这不是一个好的做法,但此时我的 Web 应用程序与其 API 在同一应用程序/同一服务器下共存。我想知道在这种情况下是否有任何方法可以加快服务器处理请求的速度?

比如我在向同一台服务器下的API发送请求时,我使用:

require 'rest-client'

tasks = RestClient.get 'localhost:8000/tasks',
{
content_type: :json,
accept: :json,
"X-User-Email" => "blahblah@gmail.com",
"X-User-Token" => "blahblah"
}

但是,有时需要很长时间才能得到结果。或者它会导致“从服务器读取数据超时”错误。我想知道是否是因为服务器正在向自身发送请求并同时接收来自自身的请求。我尝试在端口 8000 上打开另一台服务器,向端口 3000 服务器发送请求,速度要快得多。 Rails 在多线程方面有那么差吗?

$ rails s -p 8000 -P 42323

另外,如果我先刷新8000端口的服务器页面再发送请求,再刷新3000端口的服务器页面也会快很多。是不是响应已经被Rack缓存了?

P.S 如果我错误地使用了不同的术语,我深表歉意。

编辑:

我已经尝试从 API 和应用程序 Controller 进行调试。似乎最多的延迟发生在实际访问 API Controller 之前。如果从端口 8000 向端口 8000 API 发送请求,服务器输出:

Started GET "/" for 127.0.0.1 at 2016-11-11 17:37:14 +0800
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1234567]]
Processing by TasksApplicationController#index as HTML


Started GET "/tasks" for 127.0.0.1 at 2016-11-11 17:38:14 +0800
Processing by APIController#index as JSON

所以在它开始为 API 加载路由之前,一分钟已经过去了!

因此,如果我尝试运行两个本地服务器并从端口 3000 向端口 8000 服务器发送请求,这是更快版本的输出:

Started GET "/tasks" for 127.0.0.1 at 2016-11-11 17:42:25 +0800
Processing by APIController#index as JSON

不同的是这部分输出没有了,也就没有了1分钟的延迟。

Started GET "/" for 127.0.0.1 at 2016-11-11 17:37:14 +0800
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1234567]]
Processing by TasksApplicationController#index as HTML

为什么如果我从 8000 服务器向端口 8000 服务器发送请求,我有这个额外的部分会导致如此多的时间延迟?

最佳答案

问题很可能是由于您在开发模式下运行 Webrick。虽然 Webrick 是一个多线程服务器并且 Rails 是多线程的,但在开发模式下,Rails 使用 Rake::Lock 中间件来防止并发请求。

要使 Webrick 在开发模式下完全多线程,您需要通过创建以下初始化程序来猴子修补中间件并删除 Rake::Lock:

config/initializers/multithreaded_webrick.rb:

# Remove Rack::Lock so WEBrick can be fully multi-threaded.
require 'rails/commands/server'

class Rails::Server
def middleware
middlewares = []
middlewares << [Rails::Rack::Debugger] if options[:debugger]
middlewares << [::Rack::ContentLength]

Hash.new middlewares
end
end

编辑 我找到了此信息的原始来源:

How rails resolve multi-requests at the same time?

除了初始化器你可能还需要设置:

config.cache_classes = true
config.eager_load = true

关于ruby-on-rails - Rails 本地服务器同时发送和接收请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40540679/

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