lua 协同程序

lua 将所有的协同程序放在一个名为coroutine 的table 中。通过creat 创建协同程序,它只有一个参数就是函数。函数的代码则是协同程序要执行的内容。

co = coroutine.create(function (a,b,c)
	print("co",a,b,c) end)
coroutine.resume(co,1,2,3)

输出结果:co 1 2 3

一个协同程序可以处于四种不同状态,挂起(suspend)运行(running)死亡(dead)正常(normal)。当创建一个协同程序事它处于挂起。

print(coroutine.status(co))   ------suspended

coroutine.resume 用于再次启动协同程序。


通过yield 使协同程序挂起。

co = coroutine.create(function (  )
	for i = 1,10  do
		print("co",i)
		coroutine.yield()
	end
	-- body
end)

此时使用coroutine.resume(co)唤醒时,程序会执行到yield处挂起。

coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)
coroutine.resume(co)

输出结果:

co 1
co 2
co 3
co 4
co 5
co 6
co 7
co 8
co 9

co   10

再次唤醒,什么都不打印,协同程序已处于死亡状态


resume 对yield 传入参数。

co = coroutine.create(function  (a,b)
	coroutine.yield(co,a+b,b-a)
	end)
print(coroutine.resume(co,20,10))

输出结果:true thread: 0x7f9cd2c0a410   30 -10

第一个true表示没有错误。后续是参数传入yield的结果。

算法:输出表中所有组合方式的代码,可改为协同程序:

function printResult( a)
	for i=1,#a do
		io.write(a[i]," ")

	end
	io.write("\n")
	-- body
end

function permgen( a,n )
	n = n or #a
	if n<=1 then
		printResult(a)
	else
		for i=1,n do
			a[n], a[i] = a[i],a[n]
			permgen(a,n-1)
			a[n], a[i] = a[i],a[n]
		end
	end
	-- body

end
permgen({1,2,3,4},4)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值