Lua 5.3 协程简单示例
Lua 5.3 协程简单示例
来源 http://blog.csdn.net/vermilliontear/article/details/50547852
生产者->过滤器->消费者 模式的协程示例
function receive(prod)
local status, value = coroutine.resume(prod)
return value
end function send(x)
coroutine.yield(x)
end function producer()
return coroutine.create(function ()
while true do
local x = io.read()
send(x)
end
end)
end function filter(prod)
return coroutine.create(function ()
local line =
while true do
local x = receive(prod)
x = string.format("%5d %s", line, x)
send(x)
line = line +
end
end)
end function consumer(prod)
while true do
local x = receive(prod)
io.write(x, "\n")
end
end --[[ "producer()" 创建了一个"coroutine", 由filter掌控;
"filter()" 创建了一个"coroutine", 由consumer掌控. --]]
consumer(filter(producer()))
运行截图现象

coroutine.wrap 与 coroutine.create 的区别
-- coroutine.wrap 返回函数
co1 = coroutine.wrap(function (a)
local c = coroutine.yield(a+)
print("wrap yield before a and c: ", a, c)
return * a
end) b = co1()
print(b)
d = co1(+)
print(d) print("----------------") -- coroutine.create 返回协程本身
co2 = coroutine.create(function (a)
local c = coroutine.yield(a+)
print("wrap yield before a and c: ", a, c)
return * a
end) k, v = coroutine.resume(co2, )
print(k, v)
k, v = coroutine.resume(co2, +)
print(k, v)
运行现象:

使用”coroutines”实现了简单的抢占式线程
threads = {}
time = os.clock()
limit_time = 0.111
function cal(from, to)
local sum = ;
for i = from, to, do
sum = sum + i
if(os.clock() - time) >= limit_time then
print(string.format("Worker %d calculating, limit_time(%f), time(%f), %f%%.",
worker, limit_time, time, (i / to * )))
time = os.clock()
coroutine.yield()
end
end
end
function job(from, to)
local co = coroutine.create(function ()
cal(from, to)
end)
table.insert(threads, co)
end
job(, )
job(, )
job(, )
job(, )
while true do
local n = #threads
if n == then
break
end
for i = , n do
worker = i -- 全局变量
local status = coroutine.resume(threads[i])
if not status then
table.remove(threads, i)
break
end
end
end
运行现象:

Lua 5.3 协程简单示例的更多相关文章
- lua中的协程
lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...
- Lua 5.3 迭代器的简单示例
Lua 5.3 迭代器的简单示例 创建"closure"模式的"iterator" function allowrds() local line = io.re ...
- [转]skynet Lua中的协程
Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...
- lua编程之协程介绍
一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- Python 生成器和协程使用示例
一.生成器的创建及使用 生成器比迭代器更节省内存空间,使用生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个,的确可以使程序节省大量的内存损耗 创建生成器, ...
- 聊聊并发,进程通信方式,go协程简单应用场景
开篇提问 知道并发,并行,线程,协程概念吗?或者知道大概含义吗? 有线程为什么还要有协程?区别是什么? 『进程』通信方式知道几种?有没有超过3种? golang『协程』通信方式推荐? 使用并发的目的是 ...
- Swoole 协程使用示例及协程优先级
示例一: Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); Co\run(function () { go(function() { var_dump(fil ...
- python之进程,线程,协程简单理解
进程:资源单位,由操作系统控制调度.正在执行的一个程序或者过程,进程之间不共享资源,进程间通讯手段:管道,队列,信号量等.多用于计算密集型场景,如金融计算 线程:是cpu的最小执行单位,由操作系统控制 ...
随机推荐
- Java开发规范总结(两周至少看一次)
Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...
- 远程无法访问linux Mysql解决方案
在网上有很多关于这个的解决方案,我也采用了 写的比较详细的如: 1. 改表法.可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更 ...
- day12<常见对象+>
常见对象(Scanner的概述和方法介绍) 常见对象(Scanner获取数据出现的小问题及解决方案) 常见对象(String类的概述) 常见对象(String类的构造方法) 常见对象(String类的 ...
- Maven仓库搜索jar包依赖网址
可在该网站搜索jar包依赖 http://search.maven.org/
- Redis info 参数详解
Redis Info 命令以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值. 通过给定可选的参数 section ,可以让命令只返回某一部分的信息: server : 一般 ...
- 简易RPC框架-过滤器机制
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Linux修改hostname的几种方法
修改hostname有几种方式 1: hostname DB-Server --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改 ...
- Java公开课-01.类和对象
一,类和对象的含义 1.类:类是具有相同属性(静态特征)和行为(功能 )的一系列事物的集合. eg:以下俩者是不是类 1)汽车 √ 2)小胖桌子上那个红色的杯子 × 2.对象:被精确限定到一个特殊 ...
- 【京东个人中心】——Nodejs/Ajax/HTML5/Mysql爬坑之注册与登录监听
一.引言 在数据库和静态页面都创建好之后,下面就该接着完成后台Node.js监听注册和登录的部分了.这个部分主要使用的技术是:Node.js的Express框架和ajax异步请求.登录和注册的代码实现 ...
- 【转】NAS群晖DSM 5.0-4458安装教程
需要准备: 1.一个闲置的U盘,容量大于64M即可. 墙裂建议用如下U盘,可以隐藏成灰群晖,小巧方便. 闪迪(SanDisk)酷豆(CZ33)8GB U盘¥29.9京东商城 2.一台显示器,用于 ...