这周四的 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 并发
coroutine 是可以,但是,作为浏览器回调函数感觉会很费解
yield 就快啦 http://wingolog.org/archives/2013/05/08/generators-in-v8 还有node-fibers
wind.js 文档又少而且他自己都说不维护了 synchronous-to-asynchronous-javascript-compilers-cps
node-core 本来是用的 promise 的,不过因为 callback 形式比较流行又换过去了 现在是把 promise 的实现,控制流管理之类的都放到 user-land 还有个 fantasy-land,想把 functor,monad 之类的引进去
There is no clear winner in the duel. I prefer Haskell, but I am biased and believe in static typing. Yet I like programming in Erlang - both languages are good from different perspectives.
http://jlouisramblings.blogspot.com/2010/04/haskell-vs-erlang-for-bittorent-clients.html
After 2 months of tuning on and off I went back to Erlang Unoptimized Erlang version as fast as Combinatorrent in practice
http://www.erlang-factory.com/upload/presentations/658/jlouis-euc-2012.pdf
#19 楼 @luikore http://ruby-china.org/topics/7732
Erlang -> Core Erlang -> BEAM bytecode
parse_transform 就可以了
Forms 就是啦
其实完全没必要的,你可以直接写个 Parser 生成 CoreErlang 或者 BEAM 的
#23 楼 @ShiningRay 嗯嗯, 最近想用 sinatra-synchrony + pg 写点东西, 但是就不能用 activerecord 了?
https://gist.github.com/apeckham/3955222
还没尝试和 AR 一起用的 https://github.com/leftbee/em-postgresql-adapter