0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是事件循环

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-11-01 10:00 次阅读

Python的Asyncio模块提供了管理事件、协程、任务和线程的方法,以及编写并发代码的原语。此模块的主要组件和概念包括:

  • 事件循环 : 在Asyncio模块中,每一个进程都有一个事件循环。
  • 协程 : 这是子程序的泛化概念。协程可以在执行期间暂停,这样就可以等待外部的处理(例如IO)完成之后,从之前暂停的地方恢复执行。
  • Futures : 定义了 Future 对象,和 concurrent.futures 模块一样,表示尚未完成的计算。
  • Tasks : 这是Asyncio的子类,用于封装和管理并行模式下的协程。

本节中重点讨论事件,事实上,异步编程的上下文中,事件无比重要。因为事件的本质就是异步。

1. 什么是事件循环

在计算系统中,可以产生事件的实体叫做事件源,能处理事件的实体叫做事件处理者。

此外,还有一些第三方实体叫做事件循环。它的作用是管理所有的事件,在整个程序运行过程中不断循环执行,追踪事件发生的顺序将它们放到队列中,当主线程空闲的时候,调用相应的事件处理者处理事件。

最后,我们可以通过下面的伪代码来理解事件循环:

while(1) {
  events = getEvents();
  for (e in events)
    processEvent(e);
}

所有的事件都在 ** while **循环中捕捉,然后经过事件处理者处理。事件处理的部分是系统唯一活跃的部分,当一个事件处理完成,流程继续处理下一个事件。

2. 准备工作

Asyncio提供了以下方法来管理事件循环:

  1. ** loop = get_event_loop() ** : 得到当前上下文的事件循环。
  2. ** loop.call_later(time_delay, callback, arg) ** : 延后 time_delay 秒再执行 callback 方法。
  3. ** loop.call_soon(callback, argument) ** : 尽可能快调用 callback, call_soon() 函数结束,主线程回到事件循环之后就会马上调用 callback 。
  4. ** loop.time() ** : 以float类型返回当前事件循环的内部时间。
  5. ** asyncio.set_event_loop() ** : 为当前上下文设置事件循环。
  6. ** asyncio.new_event_loop() ** : 根据此策略创建一个新的事件循环并返回。
  7. ** loop.run_forever() **: 在调用 stop() 之前将一直运行。

3. 如何做…

下面的代码中,我们将展示如何使用Asyncio库提供的事件循环创建异步模式的应用。

import asyncio
import datetime
import time

def function_1(end_time, loop):
    print("function_1 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_2, end_time, loop)
    else:
        loop.stop()

def function_2(end_time, loop):
    print("function_2 called ")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_3, end_time, loop)
    else:
        loop.stop()

def function_3(end_time, loop):
    print("function_3 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_1, end_time, loop)
    else:
        loop.stop()

def function_4(end_time, loop):
    print("function_5 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_4, end_time, loop)
    else:
        loop.stop()

loop = asyncio.get_event_loop()

end_loop = loop.time() + 9.0
loop.call_soon(function_1, end_loop, loop)
# loop.call_soon(function_4, end_loop, loop)
loop.run_forever()
loop.close()

运行结果如下:

python3 event.py
function_1 called
function_2 called
function_3 called
function_1 called
function_2 called
function_3 called
function_1 called
function_2 called
function_3 called

在这个例子中,我们定义了三个异步的任务,相继执行,入下图所示的顺序。

图片

首先,我们要得到这个事件循环:

loop = asyncio.get_event_loop()

然后我们通过** call_soon **方法调用了 ** function_1() ** 函数。

end_loop = loop.time() + 9.0
loop.call_soon(function_1, end_loop, loop)

让我们来看一下 ** function_1() ** 的定义:

def function_1(end_time, loop):
    print("function_1 called")
    if (loop.time() + 1.0) < end_time:
        loop.call_later(1, function_2, end_time, loop)
    else:
        loop.stop()

这个函数通过以下参数定义了应用的异步行为:

  1. **end_time ** : 定义了 function_1() 可以运行的最长时间,并通过 call_later 方法传入到 function_2() 中作为参数
  2. **loop ** : 之前通过 get_event_loop() 方法得到的事件循环。

** function_1() ** 的任务非常简单,只是打印出函数名字。当然,里面也可以写非常复杂的操作。

print("function_1 called")

任务执行结束之后,它将会比较 ** loop.time() ** **+1s 和设定的运行时间,如果没有超过,使用call_later **在1秒之后执行 ** function_2() **

if (loop.time() + 1.0) < end_time:
    loop.call_later(1, function_2, end_time, loop)
else:
    loop.stop()

其中**function_2() **和 ****function_3() **** 的作用类似。如果运行的时间超过了设定,事件循环终止。

loop.run_forever()
loop.close()
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2703

    浏览量

    47458
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81024
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68568
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84664
收藏 人收藏

    评论

    相关推荐

    066. while循环:5.1 循环章节课程介绍

    循环
    充八万
    发布于 :2023年07月05日 15:47:47

    067. while循环:5.2 了解循环

    循环
    充八万
    发布于 :2023年07月05日 15:48:56

    066. while循环:5.1 循环章节课程介绍

    循环
    充八万
    发布于 :2023年07月07日 03:42:29

    074. while循环:5.9 循环的注意事项

    循环
    充八万
    发布于 :2023年07月07日 06:56:17

    系统的消息循环

    系统的消息循环 一、 实验目的学习使用系统的消息循环。掌握如何通过系统的消息循环来响应键盘的消息,同时学会使用图形模式
    发表于 12-25 23:56 1104次阅读
    系统的消息<b class='flag-5'>循环</b>

    循环码,循环码是什么意思

    循环码,循环码是什么意思 循环码是
    发表于 03-18 14:00 9895次阅读

    在LabVIEW中使用的2种循环结构While循环和For循环的详细资料概述

    在程序设计中,如果需要重复执行一段代码,就需要使用循环结构。接下来我们将介绍在 LabVIEW 中常常使用的 2 种循环结构 While 循环和 For 循环
    发表于 06-19 08:00 33次下载
    在LabVIEW中使用的2种<b class='flag-5'>循环</b>结构While<b class='flag-5'>循环</b>和For<b class='flag-5'>循环</b>的详细资料概述

    Python的while循环是什么

    Python中有2种循环。一种循环次数明确,另一种循环次数不明确。`for循环`的循环重复次数是`明确的`,遍历对象里有几个元素,
    的头像 发表于 02-23 11:15 1275次阅读

    while循环

    while 循环定义:“当…时候,执行某段程序”。当给定的条件为真时,执行循环体;条件为假时,结束循环
    的头像 发表于 02-23 14:02 3041次阅读
    while<b class='flag-5'>循环</b>

    C语言循环的比较

    一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环体中还可以嵌套循环,这就是多层循环
    的头像 发表于 03-09 11:16 802次阅读

    WHILE ...ENDWHILE:编程设定当型循环 .EXIT:离开循环,无条件退出循环.

    当型循环。一直重复指令块直到满足了特定条件的循环。如果不满足条件,则用 ENDWHILE 后的下一个指令继续程序。在每次循环执行之前检查条件。如果从一开始就不满足条件,则不执行指令块。循环
    的头像 发表于 05-12 15:57 2791次阅读
    WHILE ...ENDWHILE:编程设定当型<b class='flag-5'>循环</b> .EXIT:离开<b class='flag-5'>循环</b>,无条件退出<b class='flag-5'>循环</b>.

    for in range循环怎么使用

    for-in range 循环是Python中的一种循环结构,用于重复执行一段代码,而且循环次数是已知的。 在Python中,for-in range 循环有以下几种用法: 通过指定
    的头像 发表于 11-21 14:49 1.3w次阅读

    python怎么设置循环次数

    在Python中,可以使用循环语句来重复执行一段代码多次。要设置循环次数,可以使用循环的计数器来控制循环的执行次数。以下是几种常用的设置循环
    的头像 发表于 11-23 15:50 5297次阅读

    循环指令loop规定循环次数

    循环指令是计算机编程中非常重要的概念,它允许程序重复执行一段代码块,使得程序可以更有效地处理大量数据和重复性任务。在本文中,我们将详尽、详实、细致地介绍循环指令的相关概念、语法和应用场
    的头像 发表于 02-14 16:10 1660次阅读

    什么是PLC循环移位指令 PLC循环移位的特点

    PLC循环移位指令包括循环左移指令和循环右移指令。在循环移位过程中,移出的位并不会丢失,而是会放回空出的位上,形成一个环形移位。
    的头像 发表于 03-07 16:57 2134次阅读
    什么是PLC<b class='flag-5'>循环</b>移位指令 PLC<b class='flag-5'>循环</b>移位的特点