Ruby ruby 3.1 Fiber scheduler 对 ffi 等应用有办法实现协程调度吗?

L-codes · 2022年03月10日 · 最后由 L-codes 回复于 2022年03月10日 · 460 次阅读

看了 ruby 3.1 对 IO 等方法实现了 hook,参考 https://docs.ruby-lang.org/en/3.1/Fiber/SchedulerInterface.html 在 ruby 3.1 对基于 ruby IO 等的 socket、http 库等进行了测试发现确实可实现协程调度

require "fiber_scheduler"
require "open-uri"

Fiber.set_scheduler(FiberScheduler.new)

Fiber.schedule do
  URI.open("https://httpbin.org/delay/2")
end

Fiber.schedule do
  URI.open("https://httpbin.org/delay/2")
end

但是用基于 libcurl 的 typhoeus 则 http 请求过程还是会阻塞,因为使用的并非 ruby 的 IO 实现

require "fiber_scheduler"
require "typhoues"

Fiber.set_scheduler(FiberScheduler.new)

Fiber.schedule do
  Typhoeus.get("https://httpbin.org/delay/2")
end

Fiber.schedule do
  Typhoeus.get("https://httpbin.org/delay/2")
end

请问针对 如这种基于 libcurl 的 ffi 程序,有办法让 fiber scheduler 实现协程调度吗? 只有等 ruby 官方加 hook 没有自行添加 hook 的实现方式吗?

提 issue 让他们支持吧

应该不行。 以后应该会回归 ruby io 了

ffi 一般用来搞计算吧,网络 IO 不划算。

316786359 回复

😃 可是也没有想到好的建议,ffi 都不全是外部 io 任务,还有计算任务

pynix 回复

目前较多项目都依赖 typhoeus 了,先不讨论换个别的 http 库,就想看看有没有不换依赖的实现😄

L-codes 回复

这库貌似不错哦。

pynix 回复

是的 对比了几个 http client 的库 这个感觉最不错的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号