分享 用 Go 的方式写 Ruby!

nikoloss · April 24, 2020 · Last by Mark24 replied at October 11, 2023 · 5021 hits

先直接看两段代码吧。

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 里面怎么减少这种 模块嵌套地狱的写法?

You need to Sign in before reply, if you don't have an account, please Sign up first.