lua脚本启动多个协程处理任务

文章介绍了Lua语言如何通过协程来模拟线程操作,详细展示了coroutine.create、coroutine.resume和coroutine.yield等API的使用,并提供了一个创建和调度20个协程执行任务的小例子,当所有协程执行完毕后,程序退出。
摘要由CSDN通过智能技术生成

简介

lua语言本身并不支持像C语言一样的线程操作。因此,如果要让lua脚本同时干多个独立的任务,就要通过协程(coroutine)模拟线程操作。只不过,lua的协程并不是由操作系统负责调度,而是由程序编写者自己通过lua api显示调度。

常用API

  1. coroutine.create (f)
    使用函数 f 作为参数,创建一个协程,并返回协程对象。
  2. coroutine.resume (co [, val1, …])
    显式调度协程 co 运行,并传入参数val1,…。返回值为协程状态和其它可选的返回值。
  3. coroutine.yield (…)
    显式挂起当前协程,同时yield参数将作为resume返回值返回给调度者。
  4. coroutine.status (co)
    返回协程 co 的状态,状态包括:running normal suspended dead 4种。

小例子

local thread_num = 20
local co = {}

function threadfunc(param)

    print("thread " .. param .. " begin")
    for i=1,5 do
        coroutine.yield()
        print("thread " .. param .. " do something")
    end
end

for i=1, 20 do
    co[i] = coroutine.create(threadfunc)
    coroutine.resume(co[i], i)  -- start the coroutine
end

while true do
	local deadnum = 0
    for i=1, thread_num do
        repeat
        local stat = coroutine.status(co[i])
        if 'dead' == stat then
            deadnum = deadnum + 1
            break
        elseif 'suspended' == stat then
            coroutine.resume(co[i], i)
        end
        until true
    end

    if deadnum == thread_num then
        print('all coroutines dead, exit')                                                                                                                      
        os.exit(0)
    end
end

运行结果

thread 1 begin
thread 2 begin
thread 3 begin
thread 4 begin
thread 5 begin
thread 6 begin
thread 7 begin
thread 8 begin
thread 9 begin
thread 10 begin
thread 11 begin
thread 12 begin
thread 13 begin
thread 14 begin
thread 15 begin
thread 16 begin
thread 17 begin
thread 18 begin
thread 19 begin
thread 20 begin
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
thread 1 do something
thread 2 do something
thread 3 do something
thread 4 do something
thread 5 do something
thread 6 do something
thread 7 do something
thread 8 do something
thread 9 do something
thread 10 do something
thread 11 do something
thread 12 do something
thread 13 do something
thread 14 do something
thread 15 do something
thread 16 do something
thread 17 do something
thread 18 do something
thread 19 do something
thread 20 do something
all coroutines dead, exit
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

化妖成魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值