原文地址http://www.daileinote.com/computer/lua/15
协程相关的文章网上有很多,众说纷坛,相比其他技术概念理解起来没那么直接。因为协程涉及了很多底层高并发概念,没接触过操作系统调度,C语言等底层知识根本不可能完全理解。
备注:以下我说的单进程就是指一个进程一个主线程
1.协程跟linux c里的epoll很像,都是单进程非阻塞的(也就是没有io等待,单核cpu利用率可以达到100%)
2.由于协程是单进程的所以没有存在像多线程多核cpu下的竞争关系
3.线程有抢占式和非抢占之说,而协程没有这一说,全部由你手动控制什么时候释放
4.协程的缺点是只能利用cpu的一个核,类似于node.js,想利用多核cpu得使用其他分布式技术
co = coroutine.create(func)
创建协程并返回
stat,data = coroutine.resume(co, 1)
启动协程并传入参数,当协程遇到yield时返回数据
stat = coroutine.status(co)
返回携程状态dead,suspend,running
coroutine.yield(x)
挂起协程并返回x到上面的data
coroutine.running()
返回正在运行的线程号
coroutine.wrap()
另一种启动协程的方法
co = coroutine.wrap(
function(i)
print(i);
end
)
--调用方法传入参数自动启动
co(1)
以下附上一个简单的例子,目前还没有在现实项目中用到协程,以后用到了再补充
跟着下标从0-5依次读下去应该就能懂
--例子---以下程序由1-5一直循环
local newProductor
function productor()
local i = 0
while true do
i = i + 1
send(i) --3
end
end
function consumer()
while true do
local i = receive() --1
print(i)
end
end
function receive()
--启动携程调用productor()
local status, value = coroutine.resume(newProductor) --2,5
return value
end
function send(x)
--挂起携程 返回到resume的地方
coroutine.yield(x) --4
end
-- 启动程序
newProductor = coroutine.create(productor)
consumer() --0
总结
1.本文只是对lua协程做简单的介绍,如果有疑问可以给我留言
2.lua的版本为5.1,运行环境centos7 64位
3.原文地址http://www.daileinote.com/computer/lua/15