Nginx与LUA(7)

news2024/9/21 20:33:28

您好,我是湘王,这是我的CSDN博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!


软件开发中,除了进程和线程,还有协程的概念。但是在搞清楚协程这个概念之前,需要明白什么是进程和线程。

进程一般是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间,例如,独立部署的jar包、运行的redis、mongodb程序等,都可以成为进程。

而线程从属于进程,是应用程序的实际执行者,一个进程至少包含一个主线程,或者有更多的子线程,线程拥有自己的栈空间。

看起来,在同一时刻多个线程是同时执行的,也就是并发执行的,但由于若干个线程对应同一个CPU,所以同一个时刻其实只有一个线程是处于执行状态的。在一个时间片内执行哪个线程是不确定的,只能控制线程的优先级,但真正的线程调度是由CPU决定的。

般情况下,各个线程都是比较独立的,各自也有明确的生命周期,如初始化、可运行、运行中、阻塞、销毁等不同的状态。

如果线程之间需要协作或者通信,那么可以通过volatile关键字、wait/notify方法、JUC工具类,或者是消息队列MQ实现。无论如何,线程都会涉及到线程锁、状态切换及上下文切换。

协程是一种比线程更加轻量级的存在,是「线程中的线程」。协程也拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协程共享全局变量和其它内容。

协程不被操作系统管理,而是完全由线程内部控制,由程序显式的进行,需要多个程序彼此协作才能完成功能,这就是协程名字的由来。

协程不是进程也不是线程,它是通过特殊的函数来实现的——这个特殊的函数可以在某个地方「挂起」,之后可以重新在其他的地方继续运行。

一个线程之内可有多个这样特殊的函数,也就是有多个协程同时运行,但多个协程的运行只能是「串行」的——一个协程运行时,其他协程必须要挂起。同时还要明确:协程也是有切换的,但它的切换不是像进程或线程那样由操作系统完成,而是由用户完成的,所以切换效率比进程或线程高。或者可以打一个这样的比方:协程类似于正在同步中的多线程,而在等待同一个线程锁的几个线程也类似于协程。

协程是LUA中引入的概念,由于OpenResty是对LUA的封装,因此也自然就具备了协程特性。

具体来说,resume和yeild是Lua协程的核心。首次调用时,resume的参数会直接传递给协程函数。非首次调用时,resume的另一个参数会成为yield的返回值,而yield的参数,也会成为resume额外的返回值。

coroutine.create(function)会传一个函数作为参数来创建协程,返回coroutine,当遇到resume时就唤醒函数调用。

而coroutine.yield()使正在执行的函数挂起,传递给yeild的参数会作为resume的额外返回值。

先来验证coroutine.create和coroutine.resume。

修改Nginx配置文件,将原来的include lua.conf改为xiecheng.conf。

vi /usr/local/openresty/nginx/conf/nginx.conf

修改xiecheng.conf内容:

vi /usr/local/openresty/nginx/conf/xiecheng.conf

修改完成后重启openresty:

/usr/local/openresty/nginx/sbin/nginx -s reload

访问浏览器:

http://IP地址/xiecheng

可以看到三次结果都不同:这其实就是resume返回值的三种情况

其他的协程方法包括:

1、coroutine.isyieldable(),表示如果正在运行的协程可以挂起,则返回true(只有主协程(线程)和C函数是无法让出的);

2、coroutine.running(),用来判断当前执行的协程是不是主线程,如果是就返回true;

3、coroutine.status(function),返回表示协程状态的字符串:

running:正在执行中的协程;

suspended:还未结束却被挂起(调用了yeild或还没开始运行)的协程;

normal:协程A resume协程B时,协程A所处的状态就是normal;

dead:发生错误或正常终止的协程,如果这时候对它调用resume,将返回false和错误消息,就像刚才展示的那样。

修改配置文件验证语法:

vi /usr/local/openresty/nginx/conf/xiecheng.conf

修改完成后重启openresty:

/usr/local/openresty/nginx/sbin/nginx -s reload

访问浏览器:

http://IP地址/xiecheng3

协程时序图:

通过以上语法,可以得到几个关于OpenResty协程的知识:

1、所有的协程都是通过resume和yield协作的,这是协程的核心所在,可以说没有resume和yield的协作,就没有协程;

2、resume和yield都是由开发者控制的,除此之外,是不会有任何其他第三方系统干预的,但线程就不一样;

3、函数从哪里挂起,恢复时就从哪里开始执行,关于这一点,可以尝试在r1中的coroutine.yield("b")前后各加上一行ngx.print()语句来验证。

这只是Lua协程的很小一部分,Lua中没有线程和异步编程的概念,但对于并发执行却提供了协程的方式,这确实有点奇怪。ngx_lua模块对协程做了封装,可以直接通过ngx.thread API来调用。其原理就是协程A在运行中发现自己忙,则把CPU使用权让出来给协程B使用,最后协程A能从中断位置继续执行,本地还是CPU独占的单线程。


节日期间,您仍然可以随时咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~再次祝您兔年吉祥,万事胜意!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用小程序+网页简易实现多客户端实时弹幕

此文主要通过小程序网页模拟多客户端通过轮询、WebSockets、订阅推送等方式简易实现实时弹幕。 实现流程1、服务端1.1、创建项目2.2、接口定义2、客户端2.1、小程序端2.2、web端3、实现方式3.1、轮询3.2、WebSocket3.3、订阅推送实现流程 1、服务端 1.1、创建项目 打开Visual…

【docker概念和实践 5】容器命令和案例(1)

一、说明 docker的四个要素是:本地的Docker-engine、网上(本地)的仓库、镜像images、容器;初学者必须了解这是个概念的关系。但是,真正重要的概念是容器,因为,只有掌握了容器,才能具…

SpringBoot整合SSM

添加pom依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope></dependency><dependency><groupId>org.mybati…

macOS Monterey 12.6.3 (21G419) Boot ISO 原版可引导镜像

macOS Monterey 12.6&#xff0c;皆为安全更新&#xff0c;不再赘述。 macOS Monterey 12.6&#xff0c;发布于 2022 年 9 月 12 日&#xff08;北京时间今日凌晨&#xff09;&#xff0c;本次为安全更新。 今日&#xff08;2022-07-21&#xff09;凌晨&#xff0c;Apple 终于…

【Hadoop】HDFS高可用与高扩展原理分析(HA架构与Federation机制)

文章目录一、HDFS的高可用性&#xff08;HA架构&#xff09;二、HDFS的高扩展性&#xff08;Federation机制&#xff09;三、HA架构 Federation机制一、HDFS的高可用性&#xff08;HA架构&#xff09; 为保证HDFS的高可用性&#xff0c;即当NameNode节点机器出现故障而导致宕机…

【操作系统】—— Windows常用快捷键(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

【JavaEE】定时器的简单实现

目录 定时器 实现定时器 描述任务 保存任务 扫描任务 执行任务 定时器 在实现定时器之前&#xff0c;先来简单的了解一下什么是定时器。 定时器是软件开发中一个重要的组件。比如到了什么时候&#xff0c;干一件什么样的事情&#xff1b;多少秒之后干什么。本篇文章介绍…

活动星投票最美养生师展网络评选微信的投票方式线上免费投票

“最美养生师”网络评选投票_用户同什么方法挑选投票小程序_最好的投票小程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&…

Hive函数大全–完整版(三)

官网参考地址&#xff1a; 官网UDF - Apache Hive 1. 基本数据类型 2. 基础运算符与函数 SQL结果A IS NULL 空A IS NOT NULL 非空 A LIKE B 模糊匹配A RLIKE B 正则表达式匹配A REGEXP B 正则表达式匹配 3. 类型转换 cast(expr as <type>)…

园区网典型组网架构及案例实践

什么是园区网园区网络是限定区域内&#xff0c;连接人与物的局域网络&#xff1b;园区网络通常只有一个管理主体&#xff1b;如果有多个管理主体&#xff0c;通常被认为为多个园区网络。园区网络典型架构小型园区网络典型架构小型园区网络应用于接入用户数量较少的场景&#xf…

SpringBoot 统一功能处理

SpringBoot 统一功能处理前言一、用户登录权限效验1.1 最初的用户登录验证1.2 Spring AOP 用户统一登录验证的问题1.3 Spring 拦截器1.3.1 准备工作1.3.2 自定义拦截器1.3.3 将自定义拦截器加入到系统配置1.4 拦截器实现原理1.4.1 实现原理源码分析1.4.2 拦截器小结1.5 扩展&am…

CBC模式的3DES加解密(课程设计报告)

目录一、实验内容二、实验原理2.1 DES加解密原理2.1.1 DES加解密的基本原理2.1.2 DES加解密的关键步骤2.2 3DES加解密原理2.3 分组密码CBC加解密模式原理2.4 填充原理三、实验过程3.1 变量说明3.1.1 主函数变量说明3.1.2 其他重要变量说明3.2 函数功能说明3.2.1主函数说明3.2.2…

并行训练方法-单机多卡

一、简单方便的 nn.DataParallel DataParallel 可以帮助我们&#xff08;使用单进程控&#xff09;将模型和数据加载到多个 GPU 中&#xff0c;控制数据在 GPU 之间的流动&#xff0c;协同不同 GPU 上的模型进行并行训练&#xff08;细粒度的方法有 scatter&#xff0c;gather …

学习记录670@项目管理之变更管理

变更的分类 按变更性质分为重大变更、重要变更和一般变更&#xff0c;可通过不同审批权限控制。按变更的迫切性分为紧急变更和非紧急变更&#xff0c;可通过不同的变更处理流程进行控制。按变更所发生的领域和阶段&#xff0c;可分为进度变更、成本变更、质量变更、设计变更、…

3小时精通opencv(四) 透视变换与图像拼接

3小时精通opencv(四) 透视变换与图像拼接 参考视频资源:3h精通Opencv-Python 文章目录3小时精通opencv(四) 透视变换与图像拼接透视变换图像拼接全部代码透视变换 透视变换建立两平面场之间的对应关系&#xff0c; 将原始图片投影到一个新的视平面上 # Author : JokerTon…

Elasticsearch7.8.0版本入门——JavaAPI操作(环境准备)

目录一、创建springboot项目二、pom.xml文件引入相关maven依赖三、创建客户端对象一、创建springboot项目 创建springboot项目步骤参考此博文链接&#xff1a;https://wwwxz.blog.csdn.net/article/details/91977374 二、pom.xml文件引入相关maven依赖 引入elasticsearch依赖…

NR PUSCH(七) 相干传输

微信同步更新欢迎关注同名mode协议笔记 这篇就是为记录一个概念在协议中的体现方式。相干传输被定义为一种UE能力。考虑到UE的实现成本&#xff0c;NR不要求所有的UE都能做到所有的天线端口都可以相干传输。NR定义了以下3种UE的相干传输能力。 (1)全相干&#xff08;Fully-coh…

正点原子Linux驱动第三期

目录 第一讲 系统镜像烧写 第二讲 u-boot编译 第三讲 uboot命令使用 第四讲 Uboot源码分析 第五讲 uboot顶层 Makefile分析 第六讲 Uboot启动流程 第七讲 uboot移植 第八讲 UBoot图形化界面配置 第九讲 Linux 内核移植 第十讲 Linux内核源码目录分析 第十一讲 Linux…

六、python操作mysql篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. 下载pymysql 2. 新建数据库 3. mysql服务器版本查询 4. 执行非查询性质的SQL 5. 执行查询性质的sql 6. 执行新增sql 1. 下载pymysql 右下角点击版本 选择解释器设置 点击加号 搜…

Python(for和while)循环嵌套及用法

Python 不仅支持 if 语句相互嵌套&#xff0c;while 和 for 循环结构也支持嵌套。所谓嵌套&#xff08;Nest&#xff09;&#xff0c;就是一条语句里面还有另一条语句&#xff0c;例如 for 里面还有 for&#xff0c;while 里面还有 while&#xff0c;甚至 while 中有 for 或者 …