金沙贵宾会官网|金沙贵宾会登录-官网

【A】金沙贵宾会官网超高的返奖率为娱乐者提供资金保障,所以金沙贵宾会登录官网更加的方便了你的娱乐,申请88元彩金,因为在当中不仅仅只有游戏。

The Coroutine

日期:2019-09-26编辑作者:网络软件

关于Coroutine

金沙贵宾会官网,说到coroutine就不的不说subroutine,也就是我们常用到的一般函数。调用一个函数开始执行,然后函数执行完成后就退出,再次调用的时候,再从头开始,调用之间是没有保存状态的;但是coroutine是可以在退出时如果再次被调用,可以从上一次退出的点继续执行。也就是说coroutine的调用之间是会保存状态的。如果有多个coroutine,就可以反复调用,但是两个coroutine相互前进。当一个coroutine退出时,不是return,而是yield,表示把当前的执行权交由下一个coroutine处理,或者交出一个结果值。coroutine与我们常用到的thread有点类似,一个thread会执行一个我们指定的函数,然后当该函数调用一个阻塞IO或者同步等待一个事件或者消息时,就会被操作系统调度到等待队列,当完成或者事件响应后,线程就会继续从等待的地方执行。thread和coroutine最大的区别就是调度方式的区别,前者一般都是基于时间片的抢占式调度,而coroutine都是协作式调度。

话说回来,我们一般用的函数可以很容易的转换到coroutine。coroutine中还有一个特例,就是generator. Generator可以像一般的coroutine一样从上一次返回的地方继续执行,也可以yield多次,也可以把自己挂起,但是一般的coroutine可以在yield时指定下一个要执行的coroutine,而generator不能这么做。因此,generator一般用来实现迭代器。

Coroutine可以很方便的用来实现状态机。 Coroutine实现状态机会让代码变的更可读。比如实现一个SMTP客户端,用的是event-driven范式实现,那么就需要记录每次处理的状态,代码会变得异常复杂。假设你还是使用的event-driven范式实现,但是你用到了coroutine,coroutine内部的流程就是一般SMTP的流程,只是需要每一步请求发送后就退出,然后当收到回应包时event-driven引擎又再次调用了你的coroutine,直接到了上一次退出的地方,是不是感觉更清爽?

因为coroutine比thread相比要轻量的多,thread在操作系统层面实现,调度方式涉及到CPU上下文的切换,和coroutine的协作式调度相比要重了一些,在高并发场景中针对每个请求用thread承载会变的非常低效,但是coroutine反而容易在语言层面或者库层面实现,因此调度代价要低很多。像Lua的coroutine实现要求程序员自己调用yield自己调度,比较麻烦,但是假设像Golang,Erlang等语言把显示的协作调度隐藏起来,让程序员专注功能实现,会更容易让人接受。在golang中叫coroutine叫goroutine,当goroutine中调用了阻塞操作或者Channel的读写操作时,就会导致对应的goroutine得到执行,当完成后又会被调度回来继续执行,这种同步的编程方式可以让并发场景进行简化,让逻辑变得更清晰。Golang的这种实现把一般的显示的协作调度隐藏起来,更容易被程序员接受。

The Coroutine,thecoroutine

C语言实现的Coroutine

一般Coroutine多在带有GC机制的语言中实现,像在C/C++下实现coroutine会比较复杂和麻烦,不过还是有很多不同的实现,比如Russ Cox实现的libtask库,C++下的boost.coroutine库等等。其中我觉着最亮的是 大牛Simon Tatham基于Duff's Device实现的版本《Coroutine in C》。其中展示了如何把一个复杂的decompressor用coroutine简化的。Simon大神实现了两种coroutine,一种是基于static变量保存状态的,另外一种是通过参数传递一个指针的指针保存状态的。后者更通用一些。详细代码点击这里。

关于Coroutine

说到coroutine就不的不说subroutine,也就是我们常用到的一般函数。调用一个函数开始执行,然后函数执行完成后就退出,再次调用的时候,再从头开始,调用之间是没有保存状态的;但是coroutine是可以在退出时如果再次被调用,可以从上一次退出的点继续执行。也就是说coroutine的调用之间是会保存状态的。如果有多个coroutine,就可以反复调用,但是两个coroutine相互前进。当一个coroutine退出时,不是return,而是yield,表示把当前的执行权交由下一个coroutine处理,或者交出一个结果值。coroutine与我们常用到的thread有点类似,一个thread会执行一个我们指定的函数,然后当该函数调用一个阻塞IO或者同步等待一个事件或者消息时,就会被操作系统调度到等待队列,当完成或者事件响应后,线程就会继续从等待的地方执行。thread和coroutine最大的区别就是调度方式的区别,前者一般都是基于时间片的抢占式调度,而coroutine都是协作式调度。

话说回来,我们一般用的函数可以很容易的转换到coroutine。coroutine中还有一个特例,就是generator. Generator可以像一般的coroutine一样从上一次返回的地方继续执行,也可以yield多次,也可以把自己挂起,但是一般的coroutine可以在yield时指定下一个要执行的coroutine,而generator不能这么做。因此,generator一般用来实现迭代器。

Coroutine可以很方便的用来实现状态机。 Coroutine实现状态机会让代码变的更可读。比如实现一个SMTP客户端,用的是event-driven范式实现,那么就需要记录每次处理的状态,代码会变得异常复杂。假设你还是使用的event-driven范式实现,但是你用到了coroutine,coroutine内部的流程就是一般SMTP的流程,只是需要每一步请求发送后就退出,然后当收到回应包时event-driven引擎又再次调用了你的coroutine,直接到了上一次退出的地方,是不是感觉更清爽?

金沙贵宾会登录官网,因为coroutine比thread相比要轻量的多,thread在操作系统层面实现,调度方式涉及到CPU上下文的切换,和coroutine的协作式调度相比要重了一些,在高并发场景中针对每个请求用thread承载会变的非常低效,但是coroutine反而容易在语言层面或者库层面实现,因此调度代价要低很多。像Lua的coroutine实现要求程序员自己调用yield自己调度,比较麻烦,但是假设像Golang,Erlang等语言把显示的协作调度隐藏起来,让程序员专注功能实现,会更容易让人接受。在golang中叫coroutine叫goroutine,当goroutine中调用了阻塞操作或者Channel的读写操作时,就会导致对应的goroutine得到执行,当完成后又会被调度回来继续执行,这种同步的编程方式可以让并发场景进行简化,让逻辑变得更清晰。Golang的这种实现把一般的显示的协作调度隐藏起来,更容易被程序员接受。

boost.asio.coroutine

asio中的coroutine的实现与上面Simon的第一种实现一样。所以没有太多可说的。boost.asio.coroutine的使用非常简单,在自己代码中包含coroutine.hpp和yield.hpp,创建一个类,派生自coroutine类。然后可以根据自己的业务要求写相应的coroutine了。当然,也可以把coroutine类作为自己的成员变量组合到自己的类中。

asio的作者也对其做了详细的说明《A potted guide to stackless coroutines》,同时还写了专门个使用指南《Composed operations, coroutines and code makeover》。

C语言实现的Coroutine

一般Coroutine多在带有GC机制的语言中实现,像在C/C++下实现coroutine会比较复杂和麻烦,不过还是有很多不同的实现,比如Russ Cox实现的libtask库,C++下的boost.coroutine库等等。其中我觉着最亮的是 大牛Simon Tatham(putty的作者)基于Duff's Device实现的版本《Coroutine in C》。其中展示了如何把一个复杂的decompressor用coroutine简化的。Simon大神实现了两种coroutine,一种是基于static变量保存状态的,另外一种是通过参数传递一个指针的指针保存状态的。后者更通用一些。详细代码点击这里。

总结

想用Coroutine建议还是用些现代的新语言吧,比如Golang, Erlang, Scala等。

boost.asio.coroutine

asio中的coroutine的实现与上面Simon的第一种实现一样。所以没有太多可说的。boost.asio.coroutine的使用非常简单,在自己代码中包含coroutine.hpp和yield.hpp,创建一个类,派生自coroutine类。然后可以根据自己的业务要求写相应的coroutine了。当然,也可以把coroutine类作为自己的成员变量组合到自己的类中。

asio的作者也对其做了详细的说明《A potted guide to stackless coroutines》,同时还写了专门个使用指南《Composed operations, coroutines and code makeover》。

 

总结

想用Coroutine建议还是用些现代的新语言吧,比如Golang, Erlang, Scala等。

可以帮我翻译一下这段英文(对于协程的描述)

该可执行程序(executation)的协同程序(coroutine)可以在任何使用yield声明的地方暂停。yield返回值指定何时coroutine被复用。 当模型构建在多个框架上时Coroutines表现优秀。 Coroutines几乎没有任何的性能开销。 ,不论您能否正确得到结果StartCoroutine功能总是能立即返回。这将等到协同程序(couroutine,我怀疑原文此处有误,我当做coroutine翻译了)已完成了可执行程序。

不是太好,我没接触过协成的东东。希望能帮到你。  

对于lua: a[n], a = a, a[n]--怎错了?这行老报错?源代码是这样的:

a[n], a = a, a[n]

仔细看这句并行赋值,若 a 是一个表,则赋值结束以后,a 就变成它的元素了(在本例中,也就是一个 number)  

Coroutine,thecoroutine 关于Coroutine 说到coroutine就不的不说subroutine,也就是我们常用到的一般函数。调用一个函数开始执行,然后函数执行完...

本文由金沙贵宾会官网发布于网络软件,转载请注明出处:The Coroutine

关键词:

2008配置使用动态IP和备用地址,配置内网DNS实现

用DNS地址限制网站访问 在设置DNS地址之前我们需要知道DNS地址是什么? DNS地址是一个域名服务器地址,它可以把用户...

详细>>

牛客练习赛10

Minimal string CodeForces - 797C Minimal string CodeForces,minimalcodeforces Minimal string CodeForces - 797C 题意:有一个字符串s和空串t和...

详细>>

java语言训练班,Kotlin学习笔记

《快乐编程大本营》java语言训练班-第4课:java流程控制 if 在Kotlin中条件判断和Java一样使用的 if..else 判断,其语法如下...

详细>>