知识百科 2022-06-28 12:22 作者:baidu    浏览:146    

理解协议最重要的是了解事件的循环和任务执行的机制。以下是三个原则。

事件循环继续重复每个操作,一个操作遇到await或执行完成后,将控制权返回给事件循环,事件循环执行以下操作:

事件循环一次只能运行一个作业

赞助不包含在事件周期的执行日程中,只有在注册为任务后,事件循环才能通过任务设置日程,同时运行赞助。

使用语句定义联合函数,但不能直接执行该函数

如何实行赞助?有三种方法。

可以使用函数直接执行

启用异步等待

协作函数最重要的功能是使用语法等待其他交互。这将停止当前交互,直到其他交互返回结果。

使用函数创建作业并将其放置在事件循环中

如前所述,协议函数最重要的功能是使用语法等待其他协议。那么,在其他协定返还结果之前,可以中止目前的协定。

协作:包括协作功能和协作大象

将Coro赞助包装成一个Task,准备按期执行。返回Task对象。

如果阻止Delay指定的秒数,协会总是可以暂停当前任务并运行其他任务

通过官网两段代码详细分析协议的运行机制。

公式两个代码如下:请注意输出差异。

代码1,通过协作对象执行

输出格式:

代码2,通过操作执行

输出:

你会发现执行时间比以前的代码快一秒钟。下面解释为什么会发生这种事。

代码1的执行逻辑:

然后执行第二个代码await say_after。第二个代码第一个老师成为say_after联合程序对象,并生成与该联合对象相对应的task _ 1。

由于Await语法的原因,task_main操作将控制权返回给事件循环,并通知事件循环必须等待task1才能继续执行。

事件循环受到控制后,发现当前有两个任务task_main和task1,并且task_main正在等待task1,然后执行task1任务。

事件循环获得控制权后,有三个任务task_maintask1和task2。task_maintask1都在等待,因此task 3;将运行。

任务3将在一秒钟后完成执行,并将控制权返回给事件循环。

事件循环获得控制权。此时,如果您发现有两个任务task_main和task1,并且task_main正在等待task1,则会运行task1任务。

Task1任务执行第二个代码print。执行完成后,作业也将运行,并将控制权返回到事件循环。

事件循环获得控制权后,发现任务task_main存在,运行下一个代码await say_after以重复上述过程,直到协作结束。

Task_main执行最后一个代码。

结束事件循环

代码2的执行逻辑:

事件循环执行任务task_main,然后执行前几个代码以生成两个任务task1task2,在事件循环中注册,然后await运行“至”程序。

第一个await:awaittask 1;会拦截当前任务task_main,并将控制权返回给事件循环,事件循环获得控制权,并计划运行下一个任务task1。

此时,所有三个任务都处于await状态,事件周期处于等待状态。

此时,task2任务处于await状态,task_main也取消拦截,事件循环调度task_main的执行,执行代码行后遇到await task2,并将控制权返回给事件循环。

此时,两个任务都处于await状态,事件周期处于等待状态。

(当作业准备就绪时,等待事件循环调用。此时,await必须阻止基本任务task_main。否则,如果控制仍在task_main的手中,则在task_main作业执行完成和run执行结束的消息结束后,事件循环也将关闭并终止

实际上,如果从第二个代码中删除AWAITTTASK1,只保留AWAITTTASK2,则生成的输出相同,并且总时间相同。但是,如果只保留await task1,则没有task2的输出。

理由是要了解协议的工作机制。


 
打赏