请求 Grape API for rails 阻止其他请求
Request to Grape API for rails block other requests
对于我的 rails 应用程序,我设置了一个 API 和 gem 葡萄。我添加了一个测试 post 代码休眠 10 秒的方法和 returns {'status'=>'success'}。一切正常,除了 API 调用似乎阻止了发送到服务器的所有其他请求。在此睡眠 10 秒 api 完成之前,不会执行任何其他请求。来自前端接口的任何 GET 请求都会被延迟。如果我模拟两个 api 调用,则第二个调用需要 20 秒(等待第一个调用完成需要 10 秒)才能完成。请大家多多指教
api.rb 文件如下所示:
module ProjectName
module MyErrorFormatter
def self.call message, backtrace, options, env
{ "status" => "Fail", "error_message" => message }.to_json
end
end
class API < Grape::API
format :json
default_format :json
prefix 'api'
cascade false
error_formatter :json, MyErrorFormatter
helpers APIHelpers
before do
authenticate!
end
post do
if params[:action].present?
p_url = format_url(params)
redirect "/api/#{params[:action]}?key=#{params[:key]}#{p_url}"
end
end
post 'test' do
sleep(10)
{'status'=>'success'}
end
end
end
我正在使用 Rails 4.2.0
这意味着您的请求不是同时并行处理的。
Rails 4 中启用了线程安全,这可能与此有关。 Threadsafe 可能会锁定您的操作,因此您的下一个请求无法获得访问权限。但是,您可以明确告诉服务器处理同时请求。在您所有的 config/environments 文件中添加这一行将会有所帮助。
config.allow_concurrency = true
此外,您还需要一个像 puma 这样可以处理并发的服务器。
更多信息来自此here and here。
对于我的 rails 应用程序,我设置了一个 API 和 gem 葡萄。我添加了一个测试 post 代码休眠 10 秒的方法和 returns {'status'=>'success'}。一切正常,除了 API 调用似乎阻止了发送到服务器的所有其他请求。在此睡眠 10 秒 api 完成之前,不会执行任何其他请求。来自前端接口的任何 GET 请求都会被延迟。如果我模拟两个 api 调用,则第二个调用需要 20 秒(等待第一个调用完成需要 10 秒)才能完成。请大家多多指教
api.rb 文件如下所示:
module ProjectName
module MyErrorFormatter
def self.call message, backtrace, options, env
{ "status" => "Fail", "error_message" => message }.to_json
end
end
class API < Grape::API
format :json
default_format :json
prefix 'api'
cascade false
error_formatter :json, MyErrorFormatter
helpers APIHelpers
before do
authenticate!
end
post do
if params[:action].present?
p_url = format_url(params)
redirect "/api/#{params[:action]}?key=#{params[:key]}#{p_url}"
end
end
post 'test' do
sleep(10)
{'status'=>'success'}
end
end
end
我正在使用 Rails 4.2.0
这意味着您的请求不是同时并行处理的。 Rails 4 中启用了线程安全,这可能与此有关。 Threadsafe 可能会锁定您的操作,因此您的下一个请求无法获得访问权限。但是,您可以明确告诉服务器处理同时请求。在您所有的 config/environments 文件中添加这一行将会有所帮助。
config.allow_concurrency = true
此外,您还需要一个像 puma 这样可以处理并发的服务器。
更多信息来自此here and here。