假如,想写一个循环,依次处理2,3,5,7,11....质数位置的table元素。处理函数是:
function kaka(index,ele)
print(index,ele)--当然,这里什么也没干
end
按照文字顺序,我们先写一个循环:
for index,ele in generate(table_x) do
kaka(table_x[index])
end
那个generate()函数的任务就是生产一个元组序列:
(2,ele2),(3,ele3),(5,ele5).......
这件事可以分两步来做,先写一个函数,yield这个序列,在写一个函数驱动这个协程。
function cofunc(table_x)
coroutine.yield(2,table_x[2])
coroutine.yield(3,table_x[3])
coroutine.yield(5,table_x[5])
...
end
驱动函数:
function generate(table_x)
return coroutine.wrap(cofunc(table_x))
end
完整的程序如下:
local co=require'coroutine'
function cofunc(table_x)
co.yield(2,table_x[2])
co.yield(3,table_x[3])
co.yield(5,table_x[5])
--...
end
function generate(table_x)
return coroutine.wrap(
--这里是重点!!!!!!wrap()要求参数是一个函数!
--如果没有这个貌似多于的function()包装下cofunc(),
--lua会报告 attempt to yield across metamethod/C-call boundary
--因为协程的yield操作是不能穿越C语言调用边界的,C语言是没有Lua的栈帧的
--在元方法的调用上也是同样的限制。
--增加一个空函数包装后,就增加了栈帧
--可以改写成版本2
function()
cofunc(table_x)
end
)
end
function generate2(table_x)--这样子是不是就清楚多了?
return coroutine.wrap(
function ()
co.yield(2,table_x[2])
co.yield(3,table_x[3])
co.yield(5,table_x[5])
--...
end
)
end
function kaka(index,ele)
print(index,ele)--当然,这里什么也没干
end
table_x={}
table_x[2]='a'
table_x[3]='b'
table_x[5]='c'
for index,ele in generate(table_x) do
kaka(index,ele)
end
print('----------华丽的分割线-----------')
for index,ele in generate2(table_x) do
kaka(index,ele)
end
来个有用些的例子:
module('walkdir',package.seeall)
require'lfs'
local sep = "//"
function walkdir (path)
local i = 1
for file in lfs.dir(path) do
if file ~= "." and file ~= ".." then
local f = path..sep..file
--print ("/t=> "..f.." <=")
local attr = lfs.attributes (f)
assert (type(attr) == "table")
if attr.mode == "directory" then
coroutine.yield(file,path,attr)
walkdir (f)
else
coroutine.yield(file,path,attr)
end
end
end
end
function generate_dirwalker(path)
return coroutine.wrap(
function()
walkdir(path)
end
)
end
--test
function print_all(f,p,a)
print(string.format("%25s/t/t%s/t/t%s",f,p,a.mode))
end
for file,path,attr in generate_dirwalker('c://Downloads') do
print_all(file,path,attr)
end
--test
分享到:
相关推荐
05-多任务-协程(python和linux高级编程阶段 代码和截图)05-多任务-协程(python和linux高级编程阶段 代码和截图)05-多任务-协程(python和linux高级编程阶段 代码和截图)05-多任务-协程(python和linux高级编程...
基于Kotlin协程实现异步编程
协程协程协程协程协程协程协程协程协程协程协程协程协程协程
用于在Python 3.4中进行协程驱动的基于异步的泛型编程的小工具库
使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有 应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序...
协程求素数的思路分析
python编程教程之装饰器、协程、并发编程。适用于初学者。可用于平时自学。
协程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位。 协程可以被认为是一种用户空间线程,与传统...
2 WarriorMan因为HOOK了PHP TCP Socket类型的流,所以常见的Redis , PDO , Mysqli以及用PHP的系列函数操作TCP连接的操作,都进行支持协程调度,减少了编程复杂度。 3会逐步提供更多实质方法,为开发者提供更多的灵
安卓 Kotlin Coroutine协程 使用方式代码举例: 包含GlobalScope 、CoroutineScope 详细使用代码举例,相关介绍文章,可参考: https://xiaxl.blog.csdn.net/article/details/123383727
Android使用kotlin协程+ksoap2实现WebService操作,目标API30,并解决异步通信时Handler()过时的问题
c++ 下多协程,以及使用libgo,多协程的优势,作用,与多线程对比
基于qt协程的网络编程库 QtNetworkNg源代码
基于协程编程在移动端研发的最佳实践.pptx
python协程.pptx
协程大家都知道,比线程更小的单位,Delphi中协程Coroutines的使用,附带两个使用demo
协程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位。 协程可以被认为是一种用户空间线程,与传统...
协程是特殊JavaScript生成器,它们会在阻塞时使用'yield'关键字挂起。 当异步结果准备就绪时,它将在不进行回调的情况下从中断处继续协程。 与Promises或Async / Await不同,协程可以在启动后被取消。 它们被挂起的...