分享 用 Go 的方式写 Ruby!

nikoloss · 2020年04月24日 · 最后由 Mark24 回复于 2023年10月11日 · 5028 次阅读

先直接看两段代码吧。

Async do |task|
  task.sleep 3
  "ok"
end
task.wait

用 Go 写的话

go func() {
  Time.Sleep(3)
  res <- "ok"
}
<- res

Async这个方案比之前的 EM 方案要优雅不少,而且基础建设比较完善了比如 task.with_timeout do 可以用来控制超时,task.stop 可以停止,而且这些事件是自动传播子协程的,比 golang 的 context 带着到处跑要优雅。 另外生态的基础建设也都具备了,比如async-ioasync-process,更有一个杀手级 web 应用falcon,我已经在生产环境中使用了,性能非常不错呀。开发框架用的roda。 falcon 在多进程*单线程的情况下能跑到 1w5 左右的 qps


注意:如果使用了 falcon,那么 roda 中的代码要写成 async 协程,用 wait 等待结果,否则会大量报错 peer connection error 可以改成如下:

class App < Roda
  route do |r|
    r.on "api" do
      r.on "case", String do |case_id|
        r.put do
          Async do
            Case.new(case_id, r.params)
            "ok"
          end.wait
        end
      end
    end
  end
end

请问 Roda 里面怎么减少这种 模块嵌套地狱的写法?

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