zoukankan      html  css  js  c++  java
  • Openresty实现获取内部location

    -- 三种方式实现获取内部location信息
    --[[
    location /api1 {
        echo_sleep 3;
        echo api1: $arg_a;
    }
    location /api2 {
        echo_sleep 3;
        echo api2: $arg_a;
    }
    ]]
    
    -- 串行实现
    local t1 = ngx.now()
    local res1 = ngx.location.capture("/api1", {args = ngx.req.get_uri_args()})
    local res2 = ngx.location.capture("/api2", {args = ngx.req.get_uri_args()})
    local t2 = ngx.now()
    ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
    
    
    -- ngx.location.capture_multi实现
    -- 直接使用ngx.location.capture_multi来实现,比如访问http://192.168.1.2/concurrency1?a=22
    local t1 = ngx.now()
    local res1, res2 = ngx.location.capture_multi(
    {
        {"/api1", {args = ngx.req.get_uri_args()}},
        {"/api2", {args = ngx.req.get_uri_args()}}
    })
    local t2 = ngx.now()
    ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
    
    
    -- 协程API
    -- 使用ngx.thread.spawn创建一个轻量级线程,然后使用ngx.thread.wait等待该线程的执行成功。比如访问http://192.168.1.2/concurrency2?a=22
    local t1 = ngx.now()
    local function capture(uri, args)
        return ngx.location.capture(uri, args)
    end
    local thread1 = ngx.thread.spawn(capture, "/api1", {args = ngx.req.get_uri_args()})
    local thread2 = ngx.thread.spawn(capture, "/api2", {args = ngx.req.get_uri_args()})
    local ok1, res1 = ngx.thread.wait(thread1)
    local ok2, res2 = ngx.thread.wait(thread2)
    local t2 = ngx.now()
    ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
    -- 我们可以通过下面的方式实现任意一个成功即返回,之前的是等待所有执行成功才返回。
    local ok, res = ngx.thread.wait(thread1, thread2)
    
    
  • 相关阅读:
    粘包_Server
    初见UDP_Server
    初见UDP_Client
    TCP/UDP协议
    网络编程相关概念
    mmap实现大文件快速拷贝
    生成这消费者问题(多线程实现)
    线程同步互斥实现资源访问
    信号灯(线程互斥)
    线程属性
  • 原文地址:https://www.cnblogs.com/one-villager/p/9370636.html
Copyright © 2011-2022 走看看