--[[
- @desc lua数据输出
- @param string 字符串
- return string
--]]
function dump(v)
if not __dump then
function __dump(v, t, p)
local k = p or ""; if type(v) ~= "table" then
table.insert(t, k .. " : " .. tostring(v));
else
for key, value in pairs(v) do
__dump(value, t, k .. "[" .. key .. "]");
end
end
end
end local t = {'======== Lib:Dump Content ========'};
__dump(v, t);
print(table.concat(t, "\n"));
end --coroutine 是一个table 有一些方法 create wrap --create() 创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用 --resume() ()第一次调用的作用是 激活coroutine,也就是让协程函数开始运行;
()第大于1次调用的作用是 唤醒yield,使挂起的协同接着上次的地方继续运行。该函数可以传入参数
--. 一定要注意区分,第一次启动coroutine的时候,resume的参数传给匿名函数(以后不在进行匿名函数的形参赋值);
--. 在唤醒yield的时候,参数是传递给yield()的。直接从yield()的位置往下执行
--. 匿名函数执行完毕后,再次调用coroutine.resume不在起作用,因为协成状态已经停止 --coroutine.yield() 挂起coroutine, 相当于是一个特殊的return语句,只是它只是暂时性的返回(挂起),并且yield可以像return一样带有返回参数,这些参数是传递给resume的。
--coroutine.status() 查看coroutine的状态
--注:coroutine的状态有三种:dead,suspend,running,具体什么时候有这样的状态请参考下面的程序 --coroutine.wrap() 创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复
--coroutine.running() 返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号 coroutineFunc = function (a, b)
for i = , do
ngx.say(i, a, b)
coroutine.yield()
end
end co2 = coroutine.create(coroutineFunc) --创建协同程序co2
coroutine.resume(co2, , ) -- 开启协同,传入参数用于初始化
coroutine.resume(co2) --
coroutine.resume(co2, , ) -- 继续协同,传入参数无效 co3 = coroutine.create(coroutineFunc) --创建协同程序co3
coroutine.resume(co3, , ) -- 开启协同,传入参数用于初始化
coroutine.resume(co3) --
coroutine.resume(co3) -- co = coroutine.create(function (a, b)
dump(a);
ngx.say("co", a, b);
ngx.say("cooo", coroutine.yield());--第一次进来的时候这里直接停止, cooo没有输出 第二次进来在停止的地方继续执行 ngx.say("cooooo", coroutine.yield());--第三次进来时 在停止的地方继续执行 cooooo输出
end) coroutine.resume(co, , ) --co12
ngx.say("\r\n");
coroutine.resume(co, , , ) --co ,这里的两个数字参数由resume传递给yield 
coroutine.resume(co, ,)
coroutine.resume(co, ,) --第四次不执行 produceFunc = function()
while true do
local value = io.read()
print("produce: ", value)
coroutine.yield(value) --返回生产的值
end
end filteFunc = function(p)
while true do
local status, value = coroutine.resume(p); --执行 produceFunc函数
value = value * --放大一百倍
coroutine.yield(value)
end
end consumer = function(f, p)
while true do
local status, value = coroutine.resume(f, p); --唤醒生产者进行生产 执行filteFunc函数并把produceFunc当做参数传入
print("consume: ", value)
end
end --消费者驱动的设计,也就是消费者需要产品时找生产者请求,生产者完成生产后提供给消费者
producer = coroutine.create(produceFunc)
filter = coroutine.create(filteFunc)
consumer(filter, producer) ------ngx_lua多线程 案例------
local t1 = ngx.now()
local function capture(uri, args) return ngx.location.capture(uri, args) --请求本地的url地址 --[[
local res1,res2 = ngx.location.capture_multi({ -- 一次请求多个本地url
{"/api1", {args = ngx.req.get_uri_args()}},
{"/api2", {args = ngx.req.get_uri_args()}} })
--]]
end local thread1 = ngx.thread.spawn(capture, "/test", {args = ngx.req.get_uri_args()}) --开启第一个线程; 第一个参数是匿名函数 后面的参数是匿名函数的参数
local thread2 = ngx.thread.spawn(capture, "/test", {args = ngx.req.get_uri_args()}) --开启第二个线程
local ok1, res1 = ngx.thread.wait(thread1) --等待第一个线程的返回结果
local ok2, res2 = ngx.thread.wait(thread2) --等待第二个线程的返回结果
local t2 = ngx.now() dump(ok1);
dump(res1);
dump(t1 .. '--' .. t2); ngx.print("<br/>", res1.body, tostring(t2-t1))
ngx.print("<br/>", res2.body, tostring(t2-t1))

lua协程----ngx-lua线程学习笔记的更多相关文章

  1. [转]-Lua协程的实现

    协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另 外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使 ...

  2. lua协程实现

    协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使用 ...

  3. Lua 协程和线程区别

    协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua ...

  4. Openresty Lua协程调度机制

    写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...

  5. Lua 协程coroutine

    协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...

  6. 大富翁开发日记:一、使用巨型lua协程

    一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程. lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计.但这次我 ...

  7. LUA 协程

    LUA协程和C#协程非常相似,功能与用法更强大.基础用法: coco = coroutine.create(function (a,b) print("resume args:". ...

  8. lua协程实现简析

    协程,简单来说就是新创建一个协助程序(co = coroutine.create(func)),然后需要手动去启动它(coroutine.resume(co)),在它最终退出之前,它有可能暂停多次返回 ...

  9. lua 协程的理解

    参考链接: http://www.cnblogs.com/zrtqsk/p/4374360.html 对例子的自我理解: -- 协程的理解 -- co 是协程的内容,类似函数内容, 通过yield 将 ...

  10. Lua协程-测试3

    print("Lua 协程测试3") -- 实现消费者-生产者关系(生产一个就消费一个) count = -- 生产总数 -- 生产者 local newProductorCo = ...

随机推荐

  1. 采用dlopen、dlsym、dlclose加载动态链接库【总结】【转】

    转自:https://www.cnblogs.com/Anker/p/3746802.html 1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将 ...

  2. Python之 context manager

    在context manager中,必须要介绍两个概念: with as... , 和 enter , exit. 下文将先介绍with语句,然后介绍 __enter__和exit, 最后介绍cont ...

  3. 02 How to Write Go Code 如何编写go语言代码

    How to Write Go Code   如何编写go语言代码 Introduction   介绍 Code organization  组织代码 Overview  概述 Workspaces  ...

  4. git内部原理

    Git 内部原理 无论是从之前的章节直接跳到本章,还是读完了其余章节一直到这——你都将在本章见识到 Git 的内部工作原理 和实现方式. 我们发现学习这部分内容对于理解 Git 的用途和强大至关重要. ...

  5. MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应解决方法

    问题: MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应 解决方法: 如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了.这个 ...

  6. python网络编程--线程join和Daemon(守护进程)

    一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...

  7. 利用vw+rem实现移动web适配布局

    基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...

  8. java基础76 web服务器之Tomcat服务器

    (注:本文是以“压缩版Tomcat”为例,展开描述的) 一.Tomcat服务器的介绍 1.服务器 1.1.服务器的种类 从物理上讲:服务器就是一台pc机器.至少8核/8G以上.内存至少用T来计算.宽带 ...

  9. 洛谷P2015二叉苹果树

    传送门啦 树形 $ dp $ 入门题,学树形 $ dp $ 的话,可以考虑先做这个题. $ f[i][j] $ 表示在 $ i $ 这棵子树中选 $ j $ 个苹果的最大价值. include #in ...

  10. Linux学习笔记:mkdir创建文件夹

    文件夹,即目录,在linux中使用mkdir创建. 语法:mkdir dir_name 通过 mkdir 命令可以实现在指定位置创建以 dir_name(指定的文件名)命名的文件夹或目录.要创建文件夹 ...