• helloworld
    2019-06-28
    说一段比较绕口的废话来理解协程、异步:
    openresty中的一个worker进程中只有一个线程,该线程是轻量化的线程,也可以叫微线程,也可以称为协程,所谓协程就是处理协程对象的线程,所谓协程对象就是异步化的代码片段,所谓异步化就是遇到网络I/O磁盘I/O等耗时I/O操作时使CPU停止等待I/O,马上去处理下一个协程对象,避免白白浪费CPU时间,这就是非阻塞,具体说应该叫CPU非阻塞,当之前的协程对象I/O完成后,CPU在回去继续处理该协程对象剩余的代码,当然了继续处理过程中遇到I/O阻塞还会继续中断跳出去执行其他协程对象,往复...
    
     6
  • 阳光梦
    2019-06-28
    老师,基于worker的缓存模块,对数据改写操作时候也有竞争?
     1
     2
  • life_牛
    2019-09-12
    老师,编译openresty时候出现 error SSE 4.2 not found这个错误,网上有说cpu太老 如何处理这样的问题,还是可以忽略

    作者回复: OpenResty 的一些特性用到了 SSE 4.2 指令集,这个只能换机器了

     1
    
  • 宝仔
    2019-09-05
    location配置如下:
    location / {
                access_by_lua_file lua/access.lua;
                content_by_lua_file lua/content.lua;
            }

    access_by_lua_file内容如下:
    ngx.var.res = "test"
    content_by_lua_file内容如下:
    ngx.say(ngx.var.res)
    老师你好,这样子也说可以做到变量跨阶段读写的
    展开

    作者回复: 是的

    
    
  • jackstraw
    2019-08-12
    老师说的,“访问模块变量的时候,你最好保持只读,而不要尝试去修改,不然在高并发的情况下会出现 race”这个问题有点疑惑。既然每个worker同一时间只会有一个请求在进行中,那么同一时间只会有一个请求正在操作这个模块变量啊?怎么会出现race?

    作者回复: 如果修改的中途有 yield 操作,就可能会有 race。没有 yield 的话自然没有。

    
    
  • 韩健楚
    2019-07-02
    老师您好,看你的最佳实践中,遇到一个问题请教一下,在引入第三方resty库时,我根据配置请求不是返回的百度首页,是一个
    <!DOCTYPE html>
    <!--STATUS OK-->
    是什么问题?多谢。

    作者回复: 是否有更详细的信息?可以放到 gist 里面

    
    
  • FF
    2019-07-01
    温老师能否针对 OR 进程和协程的交互和他俩的协作关系展开讲讲。

    比如在同一个时间点上,每个 worker 进程只能处理一个用户的请求,也就是只有一个协程在运行。那如果协程阻塞,这个 worker 进程是否也在阻塞状态 ?协程是不是由 OR 的 worker 进程来创建 ,单个请求完后就消亡 ?

    或者这方面有什么资料可以推荐下吗?

    感谢。盼复。
    展开

    作者回复: 其实不是只有一个协程,是有一个父协程和子协程。这方面推荐 codedump 老师的源码分析:https://www.codedump.info/post/20190501-lua-stream/,内容质量很高

    
    
  • 回家
    2019-06-30
    文中这样一段话:“其余阶段都会设置一个隔离的全局变量表,以免在处理过程中污染了其他请求”。前半句似乎是要表达防止在处理的各个阶段互相干扰。后半句这样说,是因为同一个worker进程中的不同的请求其实是共享全局变量的是吧,也是同一个进程里的全局变量本来就是公用的。
    
    
  • 阳光梦
    2019-06-28
    讲的好👍
    
    
  • John
    2019-06-28
    老师,init 阶段创建的全局变量,使用content 阶段的api进行修改,是否安全?
    比如实现无reload的配置推送:
    -- 在init_by_lua 定义全局的配置文件table
    CONFIG = {a = 1};

    -- 在access_by_lua中使用全局的CONFIG实现业务逻辑
    if CONFIG['a'] = 1 then
        ngx.exit(ngx.HTTP_FORBIDDEN)
    end

    -- 为了动态跟新全局配置,提供一个API,发送get请求更新 /set-config?a =2
    location = /set-config {
          content_by_lua_block '
              local args = ngx.req.get_uri_args()
              CONFIG['a'] = args['a']
         '
    }
    展开
    
    
我们在线,来聊聊吧