Hi all,
之前曾经在论坛上求助过大家《Ruby http 库没有 non-blocking 的 API 版本?》,收到了很多回复。但感觉似乎都是为异步的并行请求设计的,在并行请求期间代码其实依然是 block 的,我现在还想寻求一种 Ruby non-blocking API 的方法,非并行请求的,不设置成功或者失败后的 Callback,无视结果,使得真正做到方法调用后不用管,这样从而达到 Non-blocking 的效果。请问有没有这种方案?
谢谢大家
#9 楼 @linjunhalida 当然没这么简单,很多号称 non-blocking 的 http 发送实际执行的时候还是在明显的 block(最简单的例子就是EM.run
),无论 callback 是否为空。我希望的就是真正 non-blocking。
是 Stream API? https://dev.twitter.com/docs/streaming-apis
这个相当于挂长连接了吧?其实对于 HTTP 而言,一般挂长连接的时候是只收不发的,比如 SSE 就是这样。 如果要做到一直发,就不能用 HTTP 了。。
#22 楼 @linjunhalida 你是说 resque 那种?我们的 OPS 大概是不会批准的吧。。我们项目里倒是 delayed job,但是我觉得往表里写数据和发送 http 请求相比效率差不多的。。。
#25 楼 @linjunhalida 我们只有一个效率很慢的 delayed job,这是因为数据库本来就要维护。resque 要用到 redis 就需要 ops 做额外工作去维护了呀,工作量变大又不涨工资的事情他们能批准嘛?
跑的结果:
$ ruby client.rb
on nonblock tcp
Time elapsed 0.000794 seconds
on blocking http
Time elapsed 2.003173 seconds
不过 request 内容要你自己用一个库来生成。
这个也许对你有帮助: https://github.com/brandonhilkert/sucker_punch
源码我还没看,如果你看了给总结下 :)
恩,跑通了,我做了一个样例,你看看: https://github.com/halida/nonblocking_http
我觉得可以基于这个方法做一个 HTTPRequest 的 gem 了
Ruby 中竟然有这么神奇的异步库 了不起啊!是该好好学习源码了
#56 楼 @iBachue typhoeus 使用了https://github.com/typhoeus/ethonhttps://github.com/ffi/ffi,来完成 libcurl 的包装。libcurl 是支持非阻塞方式调用的。
#59 楼 @jimrokliu 我前面说了,建立和断开 tcp 连接保持正常,但是 http 协议层面上面只发送不接收,一般的服务器是没有问题的。