我是靠谱客的博主 幽默人生,这篇文章主要介绍lua之coroutinecoroutine,现在分享给大家,希望可以做个参考。

coroutine

lua天然支持coroutine, coroutine属于协程而非多线程。
通过coroutine.create来创建一个协程,然后调用coroutine.resume启动,当函数中遇到coroutine.yield时协程将会被挂起直到再次调用coroutine.resume。

复制代码
1
2
3
4
5
6
7
8
local co = coroutine.create(function(...) print(...) end) print("==start==") coroutine.resume(co,"coroutine") print("==end==")

执行结果

复制代码
1
2
3
4
==start== coroutine ==end==

通过上面的例子我们可以发现当调用完coroutine.create返回的coroutine并不会直接启动,必须通过调用coroutine.resume来启动

resume

resume不仅可以可以将函数的参数传递给create的协程,而且还可以传递给yield。

复制代码
1
2
3
4
5
6
7
8
9
10
local co = coroutine.create(function(...) --function test(...) print(...) return coroutine.yield(1) end) print("==start==") print(coroutine.resume(co,"start")) print(coroutine.resume(co,"end")) print("==end==")

执行结果

复制代码
1
2
3
4
5
6
==start== start true 1 true end ==end==

第一次调用resume的时候,所带的参数"start"传递给了test函数。第二次调用resume的时候,所带的参数传递给了yield的返回值

yield

yield必须要在coroutine中调用,否则将会报错.yield的参数将会传递给resume,即resume的第二个以及后面的返回值。

示例代码-- 生产者与消费者

通过yield和resume的配合可以实现出很多高级的功能,比如生产者与消费者。以及async/await机制等.

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
local newProductor function productor() for i=1,10 do send(i) end end function consumer() for i=1,10 do local i = receive() print("consumer",i) end end function receive() local status, value = coroutine.resume(newProductor) return value end function send(x) coroutine.yield(x) end newProductor = coroutine.create(productor) consumer()

最后

以上就是幽默人生最近收集整理的关于lua之coroutinecoroutine的全部内容,更多相关lua之coroutinecoroutine内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部