这周四的 ruby tuesday 听完 nodejs 介绍获益良多。也了解到了 nodejs 社区绞尽心思改进异步写法的努力,还有就是原生 nodejs 开发者其实不喜欢写同步风格的代码 -__- . javascript 处理异常要很小心,因为 catch 不像 ruby 那样能区分异常类型,一抓就会吞掉全部异常所以要尽量缩小 try 块...
一些名词很容易搞混:异步 (async) 基本和并发 (concurrent) 一个意思,但和并行 (parallel) 完全是两回事。eventmachine 和 nodejs 都是通过多进程实现并行,通过异步 IO 实现并发的。顺序不等于同步 (如果了解 Haskell 的 Monad 和 Arrow 就会有更多的理解), 并发不等于并行。
# 顺序读文件
EM.defer do
File.read 'a'
File.read 'b'
end
# 并发读文件
EM.defer do
File.read 'a'
end
EM.defer do
File.read 'b'
end
异步网络 IO 就要用到 callback 了,但有 Fiber 这个工具在,可以用 Fiber.yield
实现依赖的顺序化
# 读 url1 成功后才读 url2
def read_urls url1, url2
f = Fiber.current
req = HttpRequest.new(url1).get
req.callback { f.resume }
req.errback { f.resume }
Fiber.yield # 将控制权交给任务队列, 然后在 callback 完成后会回到这里继续执行
return 'bad' if req.response_header.status != 200
req = HttpRequest.new(url2).get
req.callback { f.resume }
req.errback { f.resume }
Fiber.yield
return 'bad' if req.response_header.status != 200
end
Fiber.new {
read_urls url1, url2
}.resume
太复杂没记住 ... 总的来说顺序 IO 有好多套方案... 我还记得的有几种:
并发读在 node 就是天生的了,但是如果下一步操作依赖上几步的结果,就和顺序读一个思路。
另外不管哪个框架,数个文件并发读应该是比顺序读慢的... 并发读文件只是演示用... 最优的操作就是一个本地文件读和数个网络 IO 并发