1
westoy 2022-07-26 22:11:29 +08:00 1
ngx.thread.spawn 是基于 nginx IO 事件和 lua coroutine 的协程封装, 拿来处理 IO 异步的, 跑这种 CPU 运算没什么用的, 这种重 CPU 运算要尽量拆分出 nginx , 要么跑 fcgi 、scgi 之类的, 要么后端单独起一个基于 fork 机制的 http 服务器, 然后 nginx proxy 给它
|
2
clino 2022-07-26 22:23:50 +08:00
协程中间没有主动中断(比如说调用协程的 sleep ,或者等待 io )是无法跳出去运行其他协程的,这个和操作系统控制下的线程是不一样的
所以你要像切换协程,中间就要主动自己打断才能给协程跳出的机会。 |
3
eason1874 2022-07-26 22:29:46 +08:00
ngx.thread.spawn 是异步的吧,你要阻塞好像是要用 ngx.thread.wait 等待结果
|
4
Askiz OP @eason1874 但是感觉好像并没有异步,用了 ngx.spawn 还要等所有协程运行结束才能返回结果,可以看上面的运行截图
|
6
HiCode 2022-07-26 22:43:17 +08:00 1
不太确定你想要实现什么样的结果。
如果是希望提前返回结果给客户端,但继续执行其他操作,可以用 ngx.eof(),要注意此时 nginx 的 worker 还在被占用。 如果是希望在当前请求之外,开启另外的线程去处理其他事务,可以用 ngx.timer 。 |
8
eason1874 2022-07-26 23:13:12 +08:00
@Askiz 我刚测试了,是异步的,os.clock() 计算的时间不对,估计它只算父协程的时间,不包括轻线程的
你用我这段代码试试 ``` local function test(name, sec) ngx.say(name .. " start: " .. ngx.localtime()) ngx.sleep(sec) ngx.update_time() ngx.say(name .. " --end: " .. ngx.localtime()) end ngx.say("pages start: " .. ngx.localtime()) ngx.thread.spawn(test, 'test1', 1) ngx.thread.spawn(test, 'test2', 2) ngx.update_time() ngx.say("pages --end: " .. ngx.localtime()) ``` pages start: 2022-07-26 23:11:44 test1 start: 2022-07-26 23:11:44 test2 start: 2022-07-26 23:11:44 pages --end: 2022-07-26 23:11:44 test1 --end: 2022-07-26 23:11:45 test2 --end: 2022-07-26 23:11:46 |
9
eason1874 2022-07-26 23:19:40 +08:00 1
#8 补充
如果你在 pages --end 下面就用 ngx.exit(200) 退出父协程,会发现没等 test end 页面就返回了 如果在 test end 那里打日志,ngx.exit 提前退出之后,页面实时返回,也可以看到没有 end 日志,说明异步线程被中止了 |