请问 lua+nginx 怎么实现并行? - V2EX
Askiz
V2EX    NGINX

请问 lua+nginx 怎么实现并行?

  •  
  •   Askiz Jul 26, 2022 2979 views
    This topic created in 1386 days ago, the information mentioned may be changed or developed.

    ----

    ----

    ----

    ----
    这用不用 ngx.thread.spawn 时间都是一样的,请问问题出在哪呢?而且 ngx.thread.spawn 好像也不是异步执行挂在后台的。
    10 replies    2022-07-26 23:27:18 +08:00
    westoy
        1
    westoy  
       Jul 26, 2022   1
    ngx.thread.spawn 是基于 nginx IO 事件和 lua coroutine 的协程封装, 拿来处理 IO 异步的, 跑这种 CPU 运算没什么用的, 这种重 CPU 运算要尽量拆分出 nginx , 要么跑 fcgi 、scgi 之类的, 要么后端单独起一个基于 fork 机制的 http 服务器, 然后 nginx proxy 给它
    clino
        2
    clino  
       Jul 26, 2022
    协程中间没有主动中断(比如说调用协程的 sleep ,或者等待 io )是无法跳出去运行其他协程的,这个和操作系统控制下的线程是不一样的
    所以你要像切换协程,中间就要主动自己打断才能给协程跳出的机会。
    eason1874
        3
    eason1874  
       Jul 26, 2022
    ngx.thread.spawn 是异步的吧,你要阻塞好像是要用 ngx.thread.wait 等待结果
    Askiz
        4
    Askiz  
    OP
       Jul 26, 2022 via Android
    @eason1874 但是感觉好像并没有异步,用了 ngx.spawn 还要等所有协程运行结束才能返回结果,可以看上面的运行截图
    eason1874
        5
    eason1874  
       Jul 26, 2022
    @Askiz 跑一半被中止了也是可能的,你得在 test 打日志才知道有没有真的运行结束
    Q4h7388nR28s95fa
        6
    Q4h7388nR28s95fa  
       Jul 26, 2022   1
    不太确定你想要实现什么样的结果。

    如果是希望提前返回结果给客户端,但继续执行其他操作,可以用 ngx.eof(),要注意此时 nginx 的 worker 还在被占用。

    如果是希望在当前请求之外,开启另外的线程去处理其他事务,可以用 ngx.timer 。
    Askiz
        7
    Askiz  
    OP
       Jul 26, 2022 via Android
    @eason1874 我试了一下是都有的
    eason1874
        8
    eason1874  
       Jul 26, 2022
    @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
    eason1874
        9
    eason1874  
       Jul 26, 2022   1
    #8 补充

    如果你在 pages --end 下面就用 ngx.exit(200) 退出父协程,会发现没等 test end 页面就返回了

    如果在 test end 那里打日志,ngx.exit 提前退出之后,页面实时返回,也可以看到没有 end 日志,说明异步线程被中止了
    Askiz
        10
    Askiz  
    OP
       Jul 26, 2022 via Android
    @HiCode 我是想实现多个函数并发异步执行,通过信号量实现同步。每个函数都是一些正则匹配什么的运算。但似乎 ngx.thread.spawn 并不能实现。可能就像 1P 说的需要后端单独起一个可以实现并发异步的服务提供给 openresty 。
    About     Help     Advertise     Blog     API     FAQ     Solana     1738 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 16:24 PVG 00:24 LAX 09:24 JFK 12:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86