lua语言——协同程序(协程)

简介: lua语言——协同程序(协程)

什么是协同(coroutine)?

Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。

协同是非常强大的功能,但是用起来也很复杂。


线程和协同程序区别

线程与协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。

在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。

协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。


基本语法

方法 描述
coroutine.create() 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用
coroutine.resume() 重启 coroutine,和 create 配合使用
coroutine.yield() 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果
coroutine.status() 查看 coroutine 的状态 注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序
coroutine.wrap() 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复
coroutine.running() 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 corouting 的线程号

协同程序(协程)

协程的创建

--常用方法
--通过coroutine.create()
fun = function()
print(666)
end
--创建协程会有一个返回值,声明一个变量去接收
co = coroutine.create(fun)
print(co)
print(type(co))--类型线程
 
--第二种方法
--coroutine.wrap()
co2= coroutine.wrap(fun)
print(co2)
print(type(co2))
--创建出来的不是线程类型而是函数


协程运行

fun = function()
print(666)
end
co = coroutine.create(fun)
co2= coroutine.wrap(fun)
--这是协程运行的第一种方式,对应运行通过coroutine.create()创建出来的协程
coroutine.resume(co)
--第二种方式 对应通过coroutine.wrap()创建出来的协程
co2() --因为其本质就是函数,直接调就完事了


协程挂起

fun2 = function()
--先弄一个死循环
while true do
print(123)
--下面这个就是协程的挂起函数
coroutine.yield()--让其处于一个挂起的状态
end
end
co3 = coroutine.create(fun2)
coroutine.resume(co3)


目录
相关文章
|
8月前
|
C# Python
[√]lua 协程
[√]lua 协程
42 1
|
2月前
|
安全 Go 调度
|
2月前
|
监控 负载均衡 算法
Golang深入浅出之-Go语言中的协程池设计与实现
【5月更文挑战第3天】本文探讨了Go语言中的协程池设计,用于管理goroutine并优化并发性能。协程池通过限制同时运行的goroutine数量防止资源耗尽,包括任务队列和工作协程两部分。基本实现思路涉及使用channel作为任务队列,固定数量的工作协程处理任务。文章还列举了一个简单的协程池实现示例,并讨论了常见问题如任务队列溢出、协程泄露和任务调度不均,提出了解决方案。通过合理设置缓冲区大小、确保资源释放、优化任务调度以及监控与调试,可以避免这些问题,提升系统性能和稳定性。
67 6
|
2月前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
2月前
|
程序员 Go 数据处理
|
2月前
|
数据可视化 Go
|
Go
go语言获取协程id
go语言获取协程id
458 0
|
11月前
|
Java API 索引
2023-5-4-Lua语言学习(二)
2023-5-4-Lua语言学习
52 0
|
11月前
|
存储 安全 关系型数据库
2023-5-4-Lua语言学习(一)
2023-5-4-Lua语言学习
67 0