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 协程简单示例的更多相关文章

  1. lua中的协程

    lua中的协程和线程类似: 1. 协程拥有自己的独立的栈,局部变量,和指令: 2. 所有协程都可以共享全局变量: 3. 协程不能像线程那样并行执行,协程之间需要相互协调执行,同一个时刻只能运行一个协程 ...

  2. Lua 5.3 迭代器的简单示例

    Lua 5.3 迭代器的简单示例 创建"closure"模式的"iterator" function allowrds() local line = io.re ...

  3. [转]skynet Lua中的协程

    Lua中的协程 http://www.outsky.org/code/lua-coroutine.html Sep 6, 2014 Lua中的协程和其他变量一样,都是第一类值(first-class ...

  4. lua编程之协程介绍

    一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式 ...

  5. 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...

  6. Python 生成器和协程使用示例

    一.生成器的创建及使用 生成器比迭代器更节省内存空间,使用生成器,可以生成一个值的序列用于迭代,并且这个值的序列不是一次生成的,而是使用一个,再生成一个,的确可以使程序节省大量的内存损耗 创建生成器, ...

  7. 聊聊并发,进程通信方式,go协程简单应用场景

    开篇提问 知道并发,并行,线程,协程概念吗?或者知道大概含义吗? 有线程为什么还要有协程?区别是什么? 『进程』通信方式知道几种?有没有超过3种? golang『协程』通信方式推荐? 使用并发的目的是 ...

  8. Swoole 协程使用示例及协程优先级

    示例一: Co::set(['hook_flags'=> SWOOLE_HOOK_ALL]); Co\run(function () { go(function() { var_dump(fil ...

  9. python之进程,线程,协程简单理解

    进程:资源单位,由操作系统控制调度.正在执行的一个程序或者过程,进程之间不共享资源,进程间通讯手段:管道,队列,信号量等.多用于计算密集型场景,如金融计算 线程:是cpu的最小执行单位,由操作系统控制 ...

随机推荐

  1. 常见注入手法第二讲,APC注入

    常见注入手法第二讲,APC注入 转载注明出处 首先,我们要了解下什么是APC APC 是一个简称,具体名字叫做异步过程调用,我们看下MSDN中的解释,异步过程调用,属于是同步对象中的函数,所以去同步对 ...

  2. js转换字符串为数值的方法

    在js读取文本框或者其他表单数据的时候获得的值是字符串类型的,比如两个文本框a和b,假设获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,由于他们都是字符串形 ...

  3. 3.bootstrap-组件

    1.图标 <button type="button" class="btn btn-default"> <span class="g ...

  4. AngularJS -- Module (模块)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ 什么是AngularJS的模块 我们所说的模块,是你的AngularJS应用程序的一个组 ...

  5. Java客户端调用.NET的WebService

    项目需要去调用.NET的WebSrevice,本身是Java,研究了半天,终于有些头绪,记下来. 1,新建.NET WebService.只在原方法上加上一个string类型的参数str [WebMe ...

  6. 在Ubuntu上安装arm-linux-gcc的问题

    由于之前将Ubuntu的更新关掉了,所以导致我下载32位兼容包一直出错. 在arm-linux-gcc 安装之后,还不能编译程序的话,首先看自己的系统是多少位的,因为网上大部分的安装包都是32位的,所 ...

  7. Ubuntu访问window下的磁盘分区出现“Error mounting /dev/sda5 at/media”错误的解决方法

    我装ubuntu之前,电脑上安装了windows 10,为了装ubuntu,在window 10下的磁盘工具分配了30G的磁盘空间.安装完Ubuntu之后,访问window 10的磁盘分区出现“Err ...

  8. Python自学笔记-关于切片(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. 切片 L[0: ...

  9. ItemsPanelTemplate的用法

    项目里想用Silverlight制作工具栏,之前用的是Image和TextBlock完成的,但是代码混乱,在后来版本中突然想到ListBox可以实现这样的效果.使用后效果确实不错.下面是我的笔记 &l ...

  10. hiveQL去重

    去重: 以id进行分组,然后取出每组的第一个 ; 以id进行分组,按照create_time降序排序后,然后取出每组的第一个 ; 将去重后的数据重新存储 ; 去重之后与其他表join算匹配数 sele ...