Hello!
2014-05-28 20:56 GMT-07:00 小冶:
> 是不是db也不能跨协程使用啊?即使是自己spawn出去的协程?
推荐的做法是,每个“轻线程”自己维护一个专用的 cosocket 对象。在需要用时现 connect()(注意,connect
总是会先检查连接池),用完后立即调用 setkeepalive() 放回连接池。这种做法是最方便的。
如果你一定要在当前请求的所有“轻线程”之间共享一个 cosocket 对象的话,你需要自己对该 cosocket
对象的操作进行锁保护(可以通过共享的一个 Lua 变量来做锁,比如)。
> 我本来是想针对每个websocket连接,在一连上来时就打一个db存在ngx.ctx上
> 这样好处是所有操作db的函数都不用再传一个db参数了,直接去ngx.ctx.db上取即可
> 这样也有问题吗?
>
值得一提的是,ngx.ctx 本身涉及较为昂贵的 metamethod 调用,效率上远不及你自己传参。这个 API
只是为了方便起见(以及那些不便自己传参的特殊场景)。既然你已经在优化性能了,自然应当尽量避免 ngx.ctx 调用。
Regards,
-agentzh