我有这样明显的控制器代码:
require "json"
require "open-uri"
class FoobarController < ApplicationController
def get
render json: { foo: 1, bar: 2 }
end
def output
data = open("http://localhost:3000/foobar/get").read
puts(JSON.parse(data))
end
end
一个控制器的操作返回JSON,另一个操作下载并输出它。
但是这段代码不能正常工作: Foobar#get返回JSON,但返回open(...)无法加载JSON (服务器没有响应)。
但是,尽管如此,当我尝试以这种方式加载和解析JSON时,它可以正常工作。当我尝试在Foobar#output中从外部服务器加载JSON时,它也能正常工作。
但是所有这些-- Rails、OpenURI和本地主机--都破坏了我的代码。为什么?
发布于 2015-01-06 23:42:26
Webrick (你在开发环境中使用的web服务器)是用纯ruby编写的,一次只能处理一个请求。正因为如此,你的请求(来自控制器)等待当前的请求完成。
这会产生死锁,并且由于您的请求挂起,您当然不会在其他服务器/源上遇到这些问题。
解决方案
Webrick的替代方案是thin,它可以运行并发请求,有关更多信息和用法,请查看GitHub上的自述文件。
多么
将thin添加到Gemfile中
gem 'thin'
启动服务器
bundle exec thin start --threaded
https://stackoverflow.com/questions/27809141
复制相似问题