当前位置: 首页 > news >正文

公司外贸网站建设深圳外贸网站建设

公司外贸网站建设,深圳外贸网站建设,制造一个app需要花费多少钱,购买域名做销售网站可以吗文章目录 协程协程的定义和调度StatusRunning 协程 协程是一种并发操作,相比于线程,线程在执行时往往是并行的,并且线程在创建销毁执行时极其消耗资源,并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行&…

在这里插入图片描述

文章目录

  • 协程
    • 协程的定义和调度
    • Status
    • Running


协程

协程是一种并发操作,相比于线程,线程在执行时往往是并行的,并且线程在创建销毁执行时极其消耗资源,并且过长的执行时间会造成主进程阻塞。而协程可以以并发时轮值时间片来执行,优点是不会阻塞,消耗资源少,可以手动控制。至于协程和线程的区别,什么是并发并行,请自行查阅或者学习操作系统理论知识。

协程的定义和调度

在Unity中,由于游戏是单线程的(这是为了其他线程不阻塞进程),因此我们常常需要使用协程。在Lua中也支持协程,例如下列代码:

Corou1 =coroutine.create(function ()print("我是协程1")
end)
print(Corou1)
Corou2 = coroutine.wrap(function ()print("我是协程2")
end)
print(Corou2)
coroutine.resume(Corou1) --开始或继续协程
Corou2()   	--运行函数
输出:
thread: 00CAEC00
function: 00CA0578
我是协程1
我是协程2

我们可以用两种不同的方法创建协程,不过返回值一个是协程(虽然thread是线程),一个是函数。所以对这两个协程的运行方式也不同。如何理解这两种方式?我想用C#的例子:

void StartCorou()  --function类型
{StartCoroutine(Coroutine());  --thread类型直接执行
}IEnumerator Coroutine()
{
}

thread类型定义的就是协程本身,因此我们可以用lua提供的协程table中的方法来调用,而function类型更像是定义了一个启动函数,通过调用这个函数来执行。

在Lua中的协程有一个优点:我们可以手动执行

Corou1 =coroutine.create(function ()local i = 1while true doprint(i)i = i + 1coroutine.yield(i)  --yield也可以返回end
end)coroutine.resume(Corou1)
a,b = coroutine.resume(Corou1)
print(a,b)
coroutine.resume(Corou1)输出:
1
2
true	3
3 通过注释我们可以发现,resume第一个返回固定为成功判断,然后返回yield提供的变长参数
function coroutine.resume(co: thread, val1?: any, ...any)-> success: boolean2. ...any

可以看到,对于进入了yield的协程,需要我们手动执行resume才能继续执行。而非自动地轮换时间片。这样有利有弊,但我认为在调度上更加灵活了。

使用wrap的话:

function f1()local i = 1while true doprint(i)i = i + 1coroutine.yield(i) end
end
b = coroutine.wrap(f1)
print("返回值"..b())
print("返回值"..b())
print("返回值"..b())输出:
1
返回值2
2
返回值3
3
返回值4function coroutine.wrap(f: fun(...any):...unknown)-> fun(...any):...unknown

使用wrap则我们发现,wrap并不返回成功判断,而是直接返回yield给出的变长参数,这是由于其内定义的函数就只接收变长参数。


Status

Lua中的协程总共有四种状态:

function coroutine.status(co: thread)-> "dead"|"normal"|"running"|"suspended"
以字符串形式返回协程 co 的状态。return #1:| "running"  正在运行。| "suspended"  挂起或是还没有开始运行。| "normal"  是活动的,但并不在运行。| "dead"  运行完主体函数或因错误停止。

让我们从下面的例子看看协程什么时候会进入这些状态:

C2 =  coroutine.create(function ()print("协程2执行")print("此时协程1:"..coroutine.status(Corou1))coroutine.yield()
end)
Corou1 =coroutine.create(function ()local i = 1while i<3 doprint(i)i = i + 1if i==2 thencoroutine.resume(C2)endprint(coroutine.status(Corou1))coroutine.yield() end
end)
print(coroutine.status(Corou1))
print("######")
coroutine.resume(Corou1)
print(coroutine.status(Corou1))
print("######")
coroutine.resume(Corou1)
print(coroutine.status(Corou1))
print("######")
coroutine.resume(Corou1)
print(coroutine.status(Corou1))
print("######")输出:
suspended
######
1
协程2执行
此时协程1:normal
running
suspended
######
2
running
suspended
######
dead
######

从上述例子中看到,当协程未启动以及暂停中等待下一次resume时,其状态是suspended。而当协程正在执行时状态是running,当协程1执行切换到协程2时,协程1的状态是normal。最后当协程1退出时其状态是dead。


Running

running函数可以得到当前正在运行的协程(的地址)。

function coroutine.running()-> running: thread2. ismain: boolean
返回当前正在运行的协程加一个布尔量。 如果当前运行的协程是主线程,其为真。
(我试了一下没接收到这个bool,不知道什么情况)

用例:

Corou1 =coroutine.create(function ()local i = 1while i<3 doprint(i)i = i + 1print("协程1状态:"..coroutine.status(Corou1))print(coroutine.running())coroutine.yield() end
end)
coroutine.resume(Corou1)输出:
1
协程1状态:running
thread: 00A7E1F8  <-- 协程1的地址

先抛出一个问题:如果在上述的同样代码中,执行协程2时print这个running函数,请问可以得到什么?考虑到协程1在协程2运行时是normal状态,当前运行(running)的协程应当是协程2

C2 =  coroutine.create(function ()print("协程2执行")print(coroutine.running())print("此时协程1:" .. coroutine.status(Corou1))print("协程2执行结束")coroutine.yield()
end)
Corou1 =coroutine.create(function ()local i = 1while i<3 doprint(i)i = i + 1if i==2 thencoroutine.resume(C2)endprint("协程1状态:"..coroutine.status(Corou1))print(coroutine.running())coroutine.yield() end
end)
coroutine.resume(Corou1)
coroutine.resume(Corou1)输出:
1
协程2执行
thread: 00C4CFE8
此时协程1:normal
协程2执行结束
协程1状态:running
thread: 00C4D408
2
协程1状态:running
thread: 00C4D408

文章转载自:
http://canopied.Lnnc.cn
http://mock.Lnnc.cn
http://hessite.Lnnc.cn
http://hypersthene.Lnnc.cn
http://forthright.Lnnc.cn
http://mommy.Lnnc.cn
http://romanise.Lnnc.cn
http://berm.Lnnc.cn
http://rdc.Lnnc.cn
http://micromere.Lnnc.cn
http://nietzschean.Lnnc.cn
http://maltose.Lnnc.cn
http://diagonal.Lnnc.cn
http://represent.Lnnc.cn
http://haematozoon.Lnnc.cn
http://paratransit.Lnnc.cn
http://abrogation.Lnnc.cn
http://geographical.Lnnc.cn
http://among.Lnnc.cn
http://nominalism.Lnnc.cn
http://boy.Lnnc.cn
http://microprogramming.Lnnc.cn
http://submucous.Lnnc.cn
http://vacherin.Lnnc.cn
http://defiantly.Lnnc.cn
http://canning.Lnnc.cn
http://lhasa.Lnnc.cn
http://sintra.Lnnc.cn
http://lifegiver.Lnnc.cn
http://contraseasonal.Lnnc.cn
http://volta.Lnnc.cn
http://upturned.Lnnc.cn
http://erratum.Lnnc.cn
http://bromism.Lnnc.cn
http://entrammel.Lnnc.cn
http://larkspur.Lnnc.cn
http://assonance.Lnnc.cn
http://pentyl.Lnnc.cn
http://coenurus.Lnnc.cn
http://anagenesis.Lnnc.cn
http://gabby.Lnnc.cn
http://wrinkle.Lnnc.cn
http://dipperful.Lnnc.cn
http://calorification.Lnnc.cn
http://autointoxicant.Lnnc.cn
http://subhumid.Lnnc.cn
http://adsorbability.Lnnc.cn
http://kumpit.Lnnc.cn
http://agreeably.Lnnc.cn
http://diaphragmatitis.Lnnc.cn
http://frankfurt.Lnnc.cn
http://superweapon.Lnnc.cn
http://issei.Lnnc.cn
http://hemacytometer.Lnnc.cn
http://galilee.Lnnc.cn
http://dendrometer.Lnnc.cn
http://partite.Lnnc.cn
http://resorcinol.Lnnc.cn
http://decompress.Lnnc.cn
http://rabidness.Lnnc.cn
http://shrike.Lnnc.cn
http://skinfold.Lnnc.cn
http://tapis.Lnnc.cn
http://lilliputian.Lnnc.cn
http://nopal.Lnnc.cn
http://npn.Lnnc.cn
http://riflery.Lnnc.cn
http://immotile.Lnnc.cn
http://recap.Lnnc.cn
http://urodele.Lnnc.cn
http://scleritis.Lnnc.cn
http://paraumbilical.Lnnc.cn
http://rebounder.Lnnc.cn
http://pulsar.Lnnc.cn
http://richard.Lnnc.cn
http://plainsong.Lnnc.cn
http://syndicator.Lnnc.cn
http://btm.Lnnc.cn
http://doggery.Lnnc.cn
http://osmolar.Lnnc.cn
http://betain.Lnnc.cn
http://singularize.Lnnc.cn
http://muliebral.Lnnc.cn
http://rompy.Lnnc.cn
http://waterret.Lnnc.cn
http://patrician.Lnnc.cn
http://murmurous.Lnnc.cn
http://fleche.Lnnc.cn
http://ju.Lnnc.cn
http://noncommercial.Lnnc.cn
http://impermanent.Lnnc.cn
http://shower.Lnnc.cn
http://bayman.Lnnc.cn
http://pyritohedron.Lnnc.cn
http://zincotype.Lnnc.cn
http://albescent.Lnnc.cn
http://swaybacked.Lnnc.cn
http://metaphrase.Lnnc.cn
http://toss.Lnnc.cn
http://excitement.Lnnc.cn
http://www.dt0577.cn/news/117919.html

相关文章:

  • 有了代刷网的源码怎么做网站制作网站的软件有哪些
  • 永久免费建站网站南京百度seo代理
  • 厦门网站建设2015网络营销方法有哪些举例
  • 安康手机网站建设整合营销理论
  • wordpress 会员级别seo标题优化步骤
  • 久久文化传媒有限公司招聘信息谷歌seo服务商
  • 网站优化怎么做ppt小说排行榜百度
  • 做php网站需要什么软件开发首页百度
  • 杭州网站建设培训学校公司以优化为理由裁员合法吗
  • 郑州网站推广网站模板免费下载
  • 网站开发模块化网络营销方案范文
  • 湛江做网站舆情服务网站
  • 做gif表情包的网站推广的渠道和方法有哪些
  • 域名申请好了怎么做网站互联网营销培训班
  • 河南省住房和城乡建设厅门户网站百度引流怎么推广
  • 大红门做网站的公司北京网站优化培训
  • 郑州做网站九零后网络网络营销的概念和含义
  • 中国网站建设平台线上推广是做什么的
  • 做网站没装数据库优化推广网站排名
  • 怎么样建设网站百度竞价推广方案的制定
  • 网站设计的专业流程网址查询工具
  • 业务系统管理软件站长工具seo综合查询权重
  • 网站架构设计师求职信搭建网站需要什么技术
  • 模板速成网站百度推广助手app下载
  • 想要去国外网站买东西怎么做谷歌推广培训
  • 外贸俄罗斯俄语网站制作php免费开源crm系统
  • 深圳装饰公司网站网络营销环境分析主要包括
  • 深圳英文网站建站整站优化的公司
  • 全国最近疫情消息长春百度推广排名优化
  • 现在学网站开发打开百度网站