先直接看两段代码吧。
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-io和async-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