在实际使用中,openresty作为长连接客户端,去连接另一个服务器时,使用ngx.socket.tcp,connect后出来一个sock:
1、发现在ngx定时器(ngx.timer.at)中,调用sock:send会莫名其妙报 bad request的异常,调用不成功,直接挂掉
2022/03/14 16:27:40 [error] 16112#19468: *4 lua entry thread aborted: runtime error: ./app\libs\mmm_socket.lua:132: bad request
stack traceback:
coroutine 0:
[C]: in function 'send'
./app\libs\mmm_socket.lua:132: in function 'send_pack'
./app\libs\mmm_socket.lua:112: in function 'rpc_send'
./\/app/mmm_socket_client.lua:51: in function <./\/app/mmm_socket_client.lua:46>, context: ngx.timer
2、后来经过多次尝试,发现只有在主进程或者是ngx.thread.spawn出来的协程中调用才正常。
3、在ngx.timer.at中,sock展示出来的数据都是正常的,就是一调用send就挂。不知道怎么回事。
关于sock:send不能在定时器中使用的问题
定时器可以考虑队列数据,主协程恢复的时候(比如监听超时等情况),检查队列数据,然后发送出去。socket不能同时读和写,除非起两个协程,一个只读,一个只写。
明白了,确实是这样的,谢谢。看来定时器是在同一个协程中的哇。