Lua中的协同程序(coroutine)是一种轻量级的并发机制,它允许你挂起和恢复函数的执行。这使得Lua能够实现非抢占式的多任务处理。协同程序与线程类似,但它们更轻量,因为它们共享同一个线程和内存空间,只是在执行上是独立的。
协同程序的基本用法
创建协同程序:使用
coroutine.create
函数创建一个新的协同程序对象。启动协同程序:使用
coroutine.resume
函数启动或恢复协同程序的执行。暂停协同程序:在协同程序内部,使用
coroutine.yield
函数暂停执行,并将控制权交还给调用者。获取协同程序状态:使用
coroutine.status
函数获取协同程序的当前状态。
协同程序的状态
"suspended"
:协同程序已挂起,等待被恢复。"running"
:协同程序正在运行。"dead"
:协同程序已经结束。
完整项目示例
下面是一个使用Lua协同程序实现的简单示例,模拟了一个生产者-消费者模型:
-- 生产者函数
function producer(queue, limit)
for i = 1, limit do
coroutine.yield(i) -- 生产一个产品并挂起
end
end
-- 消费者函数
function consumer(queue, limit)
for i = 1, limit do
local item = coroutine.resume(queue) -- 消费一个产品
print("Consumed: " .. tostring(item))
end
end
-- 创建一个协同程序队列
local queue = coroutine.create(producer)
-- 启动生产者协同程序
coroutine.resume(queue)
-- 创建一个消费者协同程序
local consumerCoroutine = coroutine.create(consumer)
-- 消费者协同程序需要传入队列和消费次数
coroutine.resume(consumerCoroutine, queue, 5)
在这个示例中,我们定义了两个函数:producer
和consumer
。producer
函数是一个生产者,它生成一系列数字并使用coroutine.yield
挂起。consumer
函数是一个消费者,它通过调用coroutine.resume
来消费产品。
我们首先创建了一个生产者协同程序queue
,然后启动它。接着,我们创建了一个消费者协同程序consumerCoroutine
,并传入生产者协同程序和消费次数。消费者协同程序通过调用coroutine.resume
来消费产品,并打印出消费的产品。