Hello!
2014-04-13 23:12 GMT-07:00 姚尉:
> 我在写一个东西的时候用到了cosocket,我需要在一个协程里通过设置超时轮询读和写操作(类似Linux的 poll机制,
> 因为ngx_lua中tcp对象不能在两个线程中读写, cosocket也没有类似poll机制, 所以我这么做的,
> 因为不能阻塞应用程序太久,所以这个超时又不能设置的太长)。但是现在的问题是当send超时后,ngx_lua会关闭这条连接。而我希望的是在下次轮询时继续之前的发送,这样的话我必须重新连接,但是对于两个不同的连接,这样做显然是不合理的。
>
这里正确的玩法还是允许一个读线程和一个写线程同时操作一个 cosocket 对象。其他的折衷玩法都是低效和复杂的。
> 所以有个疑问想请教下你,cosocket中在调用tcpsock:send()
> 函数之前用tcpsock:settimeout()设置了超时时间,当send()函数返回timeout时,为什么ngx_lua会考虑关闭这个连接呢?
主要是为了简化 cosocket 的实现和上层用户 Lua 代码的错误处理。毕竟在写超时发生时,上层用户 Lua 代码需要自己处理发送了一半数据的情形。
> 而receive()超时不会关闭连接,这样设计是考虑到什么原因呢?
>
receive() 也是后来才支持超时不关闭连接的,这也让许多现有 Lua 用户代码的错误处理逻辑复杂了许多。即如果上层 Lua
代码在超时发生时不主动关闭连接,则后续再使用此 cosocket 对象会引入难以调试的状态错乱的问题。
> 另外如果我需要通过修改ngx_lua源码来让send()返回超时时不会关闭连接应该如何修改,我看了下源代码在,如果在这个函数ngx_http_lua_socket_handle_error(r,
> u, NGX_HTTP_LUA_SOCKET_FT_TIMEOUT);里对超时错误特殊处理是不是就行了?
>
如我刚才说的,我觉得你这里的场景的正确解法是让 ngx_lua 支持一个读线程和一个写线程同时操作一个 cosocket 对象。
Regards,
-agentzh