lua协程----ngx-lua线程学习笔记
--[[
- @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线程学习笔记的更多相关文章
- [转]-Lua协程的实现
协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另 外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使 ...
- lua协程实现
协程是个很好的东西,它能做的事情与线程相似,区别在于:协程是使用者可控的,有API给使用者来暂停和继续执行,而线程由操作系统内核控制:另外,协程也更加轻量级.这样,在遇到某些可能阻塞的操作时,可以使用 ...
- Lua 协程和线程区别
协程就是协程,不是线程. CPU执行单位是线程,不是什么协程. 协程,是同步执行,不是并行,只是切了一个上下文了,为你保存原来的上下文而已. 切到第二个协程时,原来的协程处于挂起状态. 这个特指lua ...
- Openresty Lua协程调度机制
写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...
- Lua 协程coroutine
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...
- 大富翁开发日记:一、使用巨型lua协程
一个大胆的尝试:使用巨型lua协程来表示整个“一局”流程. lua协程是一个很另类的功能,有并发的影子但又不是真的并发,所以真正拿它来做大功能框架的范例不多,通常用于一些小型trick式设计.但这次我 ...
- LUA 协程
LUA协程和C#协程非常相似,功能与用法更强大.基础用法: coco = coroutine.create(function (a,b) print("resume args:". ...
- lua协程实现简析
协程,简单来说就是新创建一个协助程序(co = coroutine.create(func)),然后需要手动去启动它(coroutine.resume(co)),在它最终退出之前,它有可能暂停多次返回 ...
- lua 协程的理解
参考链接: http://www.cnblogs.com/zrtqsk/p/4374360.html 对例子的自我理解: -- 协程的理解 -- co 是协程的内容,类似函数内容, 通过yield 将 ...
- Lua协程-测试3
print("Lua 协程测试3") -- 实现消费者-生产者关系(生产一个就消费一个) count = -- 生产总数 -- 生产者 local newProductorCo = ...
随机推荐
- Shell脚本中字符串判空:使用-z 字符串长度为0时,为真,-n字符串长度不为0,为真。这两个都不靠谱【转】
最近发现使用 -z 和 -n 来判断字符串判空,或不空时,很不靠谱. 使用下面的方法最可靠: if [ "x${value}" == "x" ] ...
- ParameterizedType获取java泛型参数类型
ParameterizedType getClass().getGenericSuperclass() 返回表示此 Class 所表示的实体(类.接口.基本类型或 void)的直接超类的 Type,然 ...
- Codeforces 807C - Success Rate(二分枚举)
题目链接:http://codeforces.com/problemset/problem/807/C 题目大意:给你T组数据,每组有x,y,p,q四个数,x/y是你当前提交正确率,让你求出最少需要再 ...
- 深度学习国外课程资料(Deep Learning for Self-Driving Cars)+(Deep Reinforcement Learning and Control )
MIT(Deep Learning for Self-Driving Cars) CMU(Deep Reinforcement Learning and Control ) 参考网址: 1 Deep ...
- 最简单删除SQL Server中所有数据的方法(不用考虑表之间的约束条件,即主表与子表的关系)
其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可能陷入死循环,二是这里使用了微软未正式公开的sp_MSF ...
- Linux下的IPC机制
Linux下的IPC机制 IPC(Inter-Process Communication)是多个进程之间相互沟通的一种方法.在linux下有多种进程间通信的方法. 共享内存 Linux内存共享有多种, ...
- Knockout.Js官网学习Demo(使用VS2012或者VS2013均可打开)
https://pan.baidu.com/s/1gf9JZ8n#list/path=%2F
- CCF CSP 201709-4 通信网络
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...
- CCF CSP 201709-3 JSON查询
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-3 JSON查询 问题描述 JSON (JavaScript Object Not ...
- CCF CSP 201709-2 公共钥匙盒
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-2 公共钥匙盒 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须 ...