我正在用ruby创建api。
正在研究异步请求、阻止程序方法(如等待异步操作)。
有谁能建议用哪种方法来处理api的异步操作
最佳答案
您可以使用Typhoeusgem来并行运行http请求。
其思想是准备几个带有块的请求,以处理每个请求的成功/错误,然后并行运行所有请求。“运行阶段”将阻塞,直到所有请求完成。
以下是项目页面中的示例:
hydra = Typhoeus::Hydra.hydra
first_request = Typhoeus::Request.new("http://example.com/posts/1")
first_request.on_complete do |response|
third_url = response.body
third_request = Typhoeus::Request.new(third_url)
hydra.queue third_request
end
second_request = Typhoeus::Request.new("http://example.com/posts/2")
hydra.queue first_request
hydra.queue second_request
hydra.run # this is a blocking call that returns once all requests are complete
如果您不想等待异步操作结束(但您的问题表明不是这样),那么这就有点复杂:您应该有一个api来运行请求并将请求id返回给调用者,它可以在以后查询api以获取与它接收到的请求id相关联的结果。
为了更灵活一点,您可以使用Faraday,这是一个http客户端库,为多个后端提供统一的接口。从你喜欢的任何后端开始,如果你想测试/提高性能,你应该可以在以后将适配器更改为另一个。
Typhoeus提供了法拉第后端,但您也可以使用基于著名gemEM-HTTP-Request的EventMachine。你可以利用ruby的纤维与faraday和em同步,如in this example所示。
下面是一个运行法拉第和伤寒并行请求的示例:https://github.com/lostisland/faraday/wiki/Parallel-requests
使用前面的示例,应该很容易适应使用em http请求适配器。