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

淘客手机网站源码wordpress博客自媒体资讯主题

淘客手机网站源码,wordpress博客自媒体资讯主题,WordPress网站动漫你在,wordpress文章运行php协程的出现大大降低了异步编程的复杂度#xff0c;可以让我们像写同步代码一样去写异步代码#xff0c;如果没有它#xff0c;那么很多异步的代码都是需要靠回调函数来一层层嵌套#xff0c;这个在我之前的一篇有介绍 rxjava回调地狱-kotlin协程来帮忙本篇文章主要介绍kotl…协程的出现大大降低了异步编程的复杂度可以让我们像写同步代码一样去写异步代码如果没有它那么很多异步的代码都是需要靠回调函数来一层层嵌套这个在我之前的一篇有介绍 rxjava回调地狱-kotlin协程来帮忙本篇文章主要介绍kotlin的suspend函数在编译生成了怎样的代码csharp的asyncawait在编译生成了怎么样的代码这两者相比较,引发怎样的思考kotlin的suspend函数demoimage这里针对kotlin的语法以及协程的具体用法细节不过多介绍就当你已了解稍微注意下runBlocking函数比较特别如下图它接受了一个suspend的block函数image所以我上面的demo这里面有其实有三个suspend函数在idea我们可以把这个kotlin代码反编译成java代码image这个反编译后的java代码 有很多报错是无法直接copy出来运行的这就没有csharp做的好csharp反编译出来的代码至少不会报红image看代码的确是一个状态机控制函数和一个匿名类还原成正常可直接运行的java代码如下测试用的coroutine版本为kotlinx-coroutines-jdk8:1.6.4image比如test1函数public static Object test1(Continuation continuation) {CoroutineTest1 continuationTest1;label20:{if (continuation instanceof CoroutineTest1) {continuationTest1  (CoroutineTest1) continuation;int i  continuationTest1.label  Integer.MIN_VALUE;if (i ! 0) {continuationTest1.label - Integer.MIN_VALUE;}break label20;}continuationTest1  new CoroutineTest1(continuation);}Object result  (continuationTest1).result;Object var4  IntrinsicsKt.getCOROUTINE_SUSPENDED();String var1;switch ((continuationTest1).label) {case 0:ResultKt.throwOnFailure(result);var1  test1-start;System.out.println(var1);(continuationTest1).label  1;if (test2(continuationTest1)  var4) {return var4;}break;case 1:ResultKt.throwOnFailure(result);break;default:throw new IllegalStateException(call to resume before invoke with coroutine);}var1  test1-end;System.out.println(var1);return Unit.INSTANCE; }final static class CoroutineTest1 extends ContinuationImpl {Object result;int label;public CoroutineTest1(Nullable ContinuationObject completion) {super(completion);}Nullablepublic Object invokeSuspend(NotNull Object $result) {this.result  $result;this.label | Integer.MIN_VALUE;return test1(this);} }其他的函数也类似完整的代码请查看https://gist.github.com/yuzd/cf67048777f0eb8fc1b3757f5bf9e8f3整个运行流程如下kotlin协程的挂起点是怎么控制的异步操作执行完后它知道从哪里恢复不难看出来suspend函数其实在编译后是变成了状态机将我们顺序执行的代码转换成了回调的形式父suspend函数里面调用子suspend函数其实是把自己传给了子suspend状态机如果子函数挂起了等子函数恢复后直接调用父函数因为通过状态机的label来控制走不同逻辑,去恢复当时的调用堆栈这就是协程的挂起与恢复机制了csharp的asyncawaitdemostatic async Task Main(string[] args) {await test1();      Console.WriteLine(Lets Go!); }async Task test1(){Console.WriteLine(test1-start);await test2();Console.WriteLine(test1-end);}async Task test2() {Console.WriteLine(test2-start);await Task.Delay(1000);Console.WriteLine(test2-end);}我们反编译查看下编译器生成了怎样的状态机image看反编译的代码比较吃力我还原成了正常代码static Task CreateMainAsyncStateMachine() {MainAsyncStateMachine stateMachine  new MainAsyncStateMachine{_builder  AsyncTaskMethodBuilder.Create(),_state  -1};stateMachine._builder.Start(ref stateMachine);return stateMachine._builder.Task; }struct MainAsyncStateMachine : IAsyncStateMachine {public int _state;public AsyncTaskMethodBuilder _builder;public TaskAwaiter _waiter;public void MoveNext(){int num1  this._state;try{TaskAwaiter awaiter;int num2;if (num1 ! 0){awaiter  UserQuery.CreateTest1AsyncStateMachine().GetAwaiter();if (!awaiter.IsCompleted){Console.WriteLine(MainAsyncStateMachine######Test1AsyncStateMachine IsCompleted:false 注册自己到Test1Async运行结束时运行);this._state  num2  0;this._waiter  awaiter;this._builder.AwaitUnsafeOnCompleted(ref awaiter, ref this);return;}}else{Console.WriteLine(MainAsyncStateMachine######Test1AsyncStateMachine IsCompleted:true);awaiter  this._waiter;this._waiter  new TaskAwaiter();this._state  num2  -1;}awaiter.GetResult();Console.WriteLine(MainAsyncStateMachine######Lets Go!);}catch (Exception e){this._state  -2;this._builder.SetException(e);return;}this._state  -2;this._builder.SetResult();}public void SetStateMachine(IAsyncStateMachine stateMachine){this._builder.SetStateMachine(stateMachine);} }完整代码请查看https://github.com/yuzd/asyncawait_study可以看出来和kotlin其实原理差不多都是生成一个函数加一个状态机区别是csharp的函数就是创建一个状态机且启动它// 当状态机启动时会触发 状态机的MoveNext方法的调用 stateMachine._builder.Start(ref stateMachine);image整体的执行流程如下imageps:最右边的是展示如果有多个await 那么就会对应这个状态机的多个状态这两者相比较,引发怎样的思考通过查看kotlin和csharp的实现方式我发现kotlin的生成的状态机(ContinuationImpl的实现)都是有继承关系的 比如demo中的test2继承了test1test继承了main通过构造函数传递的然而csharp中没有这样的关系这也带来了两者最大的区别kotlin的协程绑定了scope的概念一旦scope被取消那么scope绑定的所有的协程也都被取消。这点好像在csharp中没有如果理解有误欢迎指正这在实际应用中是怎么个区别呢举个例子async void testAsyncA(){testAsyncB();// 我想取消或者下面运行出异常了 我也无法取消testAsyncB这个任务}async void testAsyncB(){// do long task }在kotlin是可以的imagesuspend fun test2()  coroutineScope {println(test2-start)async {delay(100000);}delay(1000)println(test2-end)// 或者手动取消当前coroutineScopethis.cancel() } 我是正东关注高效率编程~
http://www.yutouwan.com/news/25275/

相关文章:

  • 网站找谁备案北京海淀建设部邮编
  • 重庆渝中区企业网站建设哪家好如何使用表格做网站
  • 网站模板可以自己做吗七牛云是干嘛的
  • 群晖wordpress站点地址山西建站
  • 网站在线优化工具物流网络化
  • 浙江手机网站建设怎么更改网站首页图片尺寸
  • 网站建设与维护课件注册网站法律风险
  • 天津网站建设找哪家北京装修公司加盟
  • 网站推广实施方案房屋装修效果图三室一厅
  • 手机网站价格win 2012 iis 默认网站
  • 2018新网站做外链建造师人才网
  • 无锡网站推广¥做下拉去118cr大连企业招聘网站
  • 网站设计论文结束语泗洪网站建设公司
  • 长沙优化科技有限公司电话公司排名seo
  • 阿里云认证网站建设题库网站建设自助建站企业
  • 网页设计网站开发培训网站技术可行性
  • 网站怎样添加百度地图网页打不开图片
  • 如何免费建立可以交流的网站卖主机 服务器的网站
  • 顶呱呱代理建设网站如何创建自己的卡网
  • 做网站用什么软件编辑北京市网络科技有限公司
  • 棋牌网站开发需要多少钱中国建筑网官网首页
  • 深圳做门户网站室内设计公司排名前十强及作品
  • 体育 网站建设询价函格式核工业南京建设集团有限公司
  • 班级网站建设的内容房产网站建设产品
  • 网站开发绩效考核23个营销专业术语
  • 做医院网站公司天津响应式网站建设
  • 网站及app开发wordpress相关书籍
  • 广西壮族自治区住房和城乡建设厅网站wordpress 律师事务所模板
  • 二级域名对于英文网站推广有什么影响网站开发需要先学数据库么
  • 自己建网站需要多少钱营销网站建设流程图