- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Lua中的协同程序探究由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
哎,周五晚上我都还这么努力看书,真是好孩子。(小若:不想吐槽了) 。
其实我都准备玩游戏看电影去的了,但是这书就摆在桌子上,而且正对着我,就想着,扫两眼吧.
结果一扫就不对劲了,因为这内容有点绕,有点小混乱,如果我现在不记录下来的话,下周一可能又要重新看一次了。 好吧,今天我们来聊聊协同程序.
1.什么是协同程序(coroutinue) 。
大家都知道线程吧?都知道多线程吧?协同程序就和这线程差不多,但是又有比较明显的区别.
多个协同程序在任意时刻只能执行一个,虽然线程在某种意义上也是这样,但这不是一样的概念.
换句话说,一个协同程序在运行的时候,其他协同程序是无法获得执行的机会的。 只有正在运行的协同程序主动挂起时,其他协同程序才有机会执行。 而线程呢?即使不主动休眠,也很有可能因为轮片时间到达而把执行机会让给其他线程.
2.创建协同程序 。
创建协同程序很简单,咋一看,其实和线程没差别~ 代码如下:
。
协同的程序的操作都在coroutine里,create函数的参数就是协同程序要执行的函数,就这么运行代码是没有效果的.
因为协同程序创建后,默认是挂起状态.
协同程序的四种状态分别为:挂起(suspended)、运行(running)、死亡(dead)、正常(normal)。 要想协同程序运行起来,就要调用resume函数。 如下代码:
。
输出结果如下:
。
3.更像样的协同程序 。
刚刚那个协同程序太简陋的,没有任何作用,直接打印一条语句之后就结束了,同时它的状态也变成了死亡状态.
我们来一个帅一点的协同程序:
。
运行结果如下:
所以我就说,电脑就是诚实,这日志打印的,真好看(小若:我们不要理这个神经病了) 。
。
4.让协同程序挂起——yield 。
既然协同程序和线程差不多,那肯定不能让协同程序一次过执行完毕了,这就没有意义了。 我们来看看怎么让协同程序挂起,如下代码:
。
输出结果如下:
这回就只输出了一条日志就停止了,后面我们还调用了status函数,打印协同程序当前的状态,suspended即为挂起状态.
。
因为这个协同程序还没有执行完毕,所以只能是挂起状态。 那么,如果让这协同程序继续执行呢?很简单,再次调用resume函数,如代码:
。
。
这次有点复杂了,先看看输出结果:
我一共执行了三次resume函数,但很显然,这个协同程序的for循环只会执行2次.
。
那为什么第二次resume执行之后,协同程序的状态还是挂起呢?不应该是结束了么?结束了就应该是死亡状态了.
而第三次执行resume之后,反而没有任何输出,此时的状态才真正切换到死亡状态。 这是为什么呢?(小若:赶紧说,不说我看电影去了) 再来这么看看就明白了,加几条打印代码:
。
输出结果如下:
这就很明显了,在协同程序里调用yield函数时,会被挂起,而yield函数的返回要等下一次调用resume函数时才能得到.
。
所以,yield函数下面的print语句在下一次的resume调用时才被执行.
又所以,当for循环第二次执行时,协同程序被挂起,需要等待再一次resume时,for循环才能真正执行完毕.
这就是这段代码的特殊之处了.
5.resume操作的返回值 。
其实resume函数是有返回值的。 我们试试运行下面的代码:
输出结果如下:
resume返回两个值,第一个值代表协同程序是否正常执行,第二个返回值自然是代表错误信息。 我们试试让协同程序出现错误:
。
输出结果如下:
。
6.结束 。
好了,虽然我已经写了这么多了,但是我真正想记录的东西还没开始写呢~! 我了个噗,今晚我还能不能好好玩了… 好吧,内容有点多,下一篇继续… 。
最后此篇关于Lua中的协同程序探究的文章就讲到这里了,如果你想了解更多关于Lua中的协同程序探究的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 C 语言新手,我编写了这个 C 程序,让用户输入一年中的某一天,作为返回,程序将输出月份以及该月的哪一天。该程序运行良好,但我现在想简化该程序。我知道我需要一个循环,但我不知道如何去做。这是程序
我一直在努力找出我的代码有什么问题。这个想法是创建一个小的画图程序,并有红色、绿色、蓝色和清除按钮。我有我能想到的一切让它工作,但无法弄清楚代码有什么问题。程序打开,然后立即关闭。 import ja
我想安装screen,但是接下来我应该做什么? $ brew search screen imgur-screenshot screen
我有一个在服务器端工作的 UDP 套接字应用程序。为了测试服务器端,我编写了一个简单的 python 客户端程序,它发送消息“hello world how are you”。服务器随后应接收消息,将
我有一个 shell 脚本,它运行一个 Python 程序来预处理一些数据,然后运行一个 R 程序来执行一些长时间运行的任务。我正在学习使用 Docker 并且我一直在运行 FROM r-base:l
在 Linux 中。我有一个 c 程序,它读取一个 2048 字节的文本文件作为输入。我想从 Python 脚本启动 c 程序。我希望 Python 脚本将文本字符串作为参数传递给 c 程序,而不是将
前言 最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止) 网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的 我
对于一个类,我被要求编写一个 VHDL 程序,该程序接受两个整数输入 A 和 B,并用 A+B 替换 A,用 A-B 替换 B。我编写了以下程序和测试平台。它完成了实现和行为语法检查,但它不会模拟。尽
module Algorithm where import System.Random import Data.Maybe import Data.List type Atom = String ty
我想找到两个以上数字的最小公倍数 求给定N个数的最小公倍数的C++程序 最佳答案 int lcm(int a, int b) { return (a/gcd(a,b))*b; } 对于gcd,请查看
这个程序有错误。谁能解决这个问题? Error is :TempRecord already defines a member called 'this' with the same paramete
当我运行下面的程序时,我在 str1 和 str2 中得到了垃圾值。所以 #include #include #include using namespace std; int main() {
这是我的作业: 一对刚出生的兔子(一公一母)被放在田里。兔子在一个月大时可以交配,因此在第二个月的月底,每对兔子都会生出两对新兔子,然后死去。 注:在第0个月,有0对兔子。第 1 个月,有 1 对兔子
我编写了一个程序,通过对字母使用 switch 命令将十进制字符串转换为十六进制,但是如果我使用 char,该程序无法正常工作!没有 switch 我无法处理 9 以上的数字。我希望你能理解我,因为我
我是 C++ 新手(虽然我有一些 C 语言经验)和 MySQL,我正在尝试制作一个从 MySQL 读取数据库的程序,我一直在关注这个 tutorial但当我尝试“构建”解决方案时出现错误。 (我正在使
仍然是一个初学者,只是尝试使用 swift 中的一些基本函数。 有人能告诉我这段代码有什么问题吗? import UIKit var guessInt: Int var randomNum = arc
我正在用 C++11 编写一个函数,它采用 constant1 + constant2 形式的表达式并将它们折叠起来。 constant1 和 constant2 存储在 std::string 中,
我用 C++ 编写了这段代码,使用运算符重载对 2 个矩阵进行加法和乘法运算。当我执行代码时,它会在第 57 行和第 59 行产生错误,非法结构操作(两行都出现相同的错误)。请解释我的错误。提前致谢:
我是 C++ 的初学者,我想编写一个简单的程序来交换字符串中的两个字符。 例如;我们输入这个字符串:“EXAMPLE”,我们给它交换这两个字符:“E”和“A”,输出应该类似于“AXEMPLA”。 我在
我需要以下代码的帮助: 声明 3 个 double 类型变量,每个代表三角形的三个边中的一个。 提示用户为第一面输入一个值,然后 将用户的输入设置为您创建的代表三角形第一条边的变量。 将最后 2 个步
我是一名优秀的程序员,十分优秀!