Python 异步之如何启动获取事件循环

目录
  • 1. 什么是 Asyncio 事件循环
  • 2. 如何启动和获取事件循环
  • 3. 什么是事件循环对象
  • 4. 为什么要访问事件循环

1. 什么是 Asyncio 事件循环

asyncio 程序的核心是事件循环。在本节中,我们将花点时间看一下 asyncio 事件循环

事件循环是用于在单个线程中执行协程的环境。事件循环是异步程序的核心。

它做了很多事情,例如:

  • 执行协程。
  • 执行回调。
  • 执行网络输入/输出。
  • 运行子进程。

事件循环是一种常见的设计模式,并且由于在 JavaScript 中的使用而在最近变得非常流行。

事件循环,顾名思义,就是一个循环。它管理一个任务列表(协同程序)并尝试在循环的每次迭代中按顺序推进每个任务,以及执行其他任务,如执行回调和处理 I/O。

“asyncio”模块提供了访问事件循环并与之交互的功能。这不是典型应用程序开发所必需的。

相反,为框架开发人员提供了对事件循环的访问,这些开发人员希望在 asyncio 模块之上构建或为其库启用 asyncio。

asyncio 模块提供了一个用于访问当前事件循环对象的低级 API,以及一套可用于与事件循环交互的方法。

低级 API 适用于将 asyncio 扩展、补充和集成到第三方库中的框架开发人员。我们很少需要与 asyncio 程序中的事件循环交互,而是使用高级 API。

尽管如此,我们还是可以简单地探讨一下如何获取事件循环。

2. 如何启动和获取事件循环

我们在 asyncio 应用程序中创建事件循环的典型方法是通过 asyncio.run() 函数。该函数接受一个协程并将执行它直到完成。我们通常将它传递给我们的主协程并从那里运行我们的程序。有用于创建和访问事件循环的低级函数。asyncio.new_event_loop() 函数将创建一个新的事件循环并返回对它的访问。

...
# create and access a new asyncio event loop
loop = asyncio.new_event_loop()

我们可以用一个有效的例子来证明这一点。

在下面的示例中,我们将创建一个新的事件循环,然后报告其详细信息。

# SuperFastPython.com
# example of creating an event loop
import asyncio
# create and access a new asyncio event loop
loop = asyncio.new_event_loop()
# report defaults of the loop
print(loop)

运行示例创建事件循环,然后报告对象的详细信息。我们可以看到,在这种情况下,事件循环的类型为 _UnixSelectorEventLoop 并且没有运行,但也没有关闭。

<_UnixSelectorEventLoop running=False closed=False debug=False>

如果 asyncio 事件循环已经在运行,我们可以通过 asyncio.get_running_loop() 函数访问它。

...
# access he running event loop
loop = asyncio.get_running_loop()

还有一个用于获取或启动事件循环的函数,称为 asyncio.get_event_loop(),但它在 Python 3.10 中已弃用,不应使用。

3. 什么是事件循环对象

事件循环作为 Python 对象实现。事件循环对象定义了事件循环的实现方式,并提供了与循环交互的通用 API,定义在 AbstractEventLoop 类中。不同平台的事件循环有不同的实现。例如,Windows 和基于 Unix 的操作系统将以不同的方式实现事件循环,因为在这些平台上实现非阻塞 I/O 的底层方式不同。

SelectorEventLoop 类型的事件循环是基于 Unix 的操作系统(如 Linux 和 macOS)的默认设置。

ProactorEventLoop 类型的事件循环是 Windows 上的默认设置。

第三方库可能会实现自己的事件循环以针对特定功能进行优化。

4. 为什么要访问事件循环

为什么我们要访问 asyncio 程序之外的事件循环?

我们可能希望从正在运行的 asyncio 程序外部访问事件循环的原因有很多。

  • 监控任务的进度。
  • 发布任务并从中获取结果。
  • 解雇并忘记一次性任务。

asyncio 事件循环可以在程序中用作基于协程任务的线程池的替代方案。事件循环也可以嵌入到普通的 asyncio 程序中并根据需要访问。

以上就是Python 异步之如何启动获取事件循环的详细内容,更多关于Python 异步事件循环的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python异步之迭代器如何使用详解

    目录 正文 1. 什么是异步迭代器 1.1. Iterators 1.2. Asynchronous Iterators 2. 什么是“async for”循环? 3. 如何使用异步迭代器 4. 异步迭代器示例 正文 迭代是 Python 中的基本操作.我们可以迭代列表.字符串和所有其他结构. Asyncio 允许我们开发异步迭代器.我们可以通过定义一个实现 aiter() 和 anext() 方法的对象来在 asyncio 程序中创建和使用异步迭代器. 1. 什么是异步迭代器 异步迭代器是一个

  • Python 异步等待任务集合

    目录 正文 1. 什么是 asyncio.wait() 2. 如何使用 asyncio.wait() 3. 等待所有任务的示例 正文 我们可以通过 asyncio.wait() 函数等待异步任务完成.可以等待不同的条件,例如所有任务完成.第一个任务完成以及第一个任务因异常而失败. 让我们仔细看看. 1. 什么是 asyncio.wait() asyncio.wait() 函数可用于等待一组异步任务完成.回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例.它允许独立

  • Python中如何创建和运行异步任务详解

    目录 正文 1. 什么是异步任务 2. 如何创建任务 2.1. 高级 API 2.2. 低级 API 3. 任务何时运行? 正文 您可以从 asyncio 程序中的协程创建任务对象.任务提供独立调度和运行的协程的句柄,并允许查询.取消任务,以及稍后检索结果和异常.异步事件循环管理任务.因此,所有协程都成为事件循环中的任务并作为任务进行管理. 让我们仔细看看 asyncio 任务. 1. 什么是异步任务 异步任务是一个调度并独立运行 asyncio 协程的对象.它提供了一个调度协程的句柄,asyn

  • 如何使用Python异步之上下文管理器

    目录 正文 1. 什么是异步上下文管理器 1.1. Context Manager 1.2. Asynchronous Context Manager 2. 如何使用异步上下文管理器 2.1. 定义 2.2. 使用 3. 异步上下文管理器和“异步”示例 正文 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过“with”表达. 它通常与资源一起使用,确保在我们完成资源后始终关闭或释放资源,无论资源的使用是成功还是因异常而

  • Python 异步如何使用等待有时间限制协程

    目录 正文 1. 什么是 Asyncio wait_for() 2. 如何使用 Asyncio wait_for() 3. 带有超时的 Asyncio wait_for() 示例 正文 我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成.如果在任务完成之前超时已过,任务将被取消. 1. 什么是 Asyncio wait_for() asyncio.wait_for() 函数允许调用者等待 asyncio 任务或协程超时完成.如果没有指定超时,wait

  • Python 异步之在 Asyncio中如何运行阻塞任务详解

    目录 正文 1. 阻塞任务 2. 如何运行阻塞任务 3. 实例 正文 阻塞任务是阻止当前线程继续进行的任务. 如果在 asyncio 程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其他协程继续进行. 我们可以通过 asyncio.to_thread() 和 loop.run_in_executor() 函数在 asyncio 程序中异步运行阻塞调用. 1. 阻塞任务 asyncio的重点是异步编程和非阻塞IO.然而,我们经常需要在 asyncio 应用程序中执行阻塞函数调用. 这可能有很

  • Python 异步之如何获取当前和正在运行任务详解

    目录 正文 1. 如何获取当前任务 2. 如何获取所有任务 正文 我们可以反省在 asyncio 事件循环中运行的任务.这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现. 1. 如何获取当前任务 我们可以通过 asyncio.current_task() 函数获取当前任务.此函数将为当前正在运行的任务返回一个任务对象. ... # get the current task task = asyncio.current_task() 传递给 asynci

  • python 异步async库的使用说明

    在学习asyncio之前,先理清楚同步/异步的概念: 同步是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 异步是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态.通知.回调来通知调用者处理结果 asyncio函数: 异步IO采用消息循环的模式,重复"读取消息-处理消息"的过程,也就是说异步IO模型"需要一个消息循环,在消息循环中,主线程不断地重复"

  • 一篇文章让你搞清楚JavaScript事件循环

    目录 前言 宏任务 微任务 事件循环 宏任务与微任务 总结 参考资料 前言 异步函数也是有执行顺序的.本质上来说,JavaScript是单线程语言,不管是在浏览器中还是nodejs环境下.浏览器在执行js代码和渲染DOM节点都是在同一个线程中,执行js代码就无法渲染DOM,渲染DOM的时候就无法执行js代码.如果按照这种同步方式执行,页面的渲染将会出现白屏甚至是报错,特别是遇到一些耗时比较长的网络请求或者js代码,因此在实际开发中一般是通过异步的方式解决. 什么是异步?js是一步一步执行代码的,

  • Node异步和事件循环的深入讲解

    目录 前言 为什么要异步? 如何实现异步? 基于事件循环的异步编程模型 timers pending idle.prepare poll check close 一些注意事项 总结 参考资料 前言 Node 最初是为打造高性能的 Web 服务器而生,作为 JavaScript 的服务端运行时,具有事件驱动.异步 I/O.单线程等特性.基于事件循环的异步编程模型使 Node 具备处理高并发的能力,极大地提升服务器的性能,同时,由于保持了 JavaScript 单线程的特点,Node 不需要处理多线

  • 在Python的一段程序中如何使用多次事件循环详解

    背景 本文主要给大家介绍了关于在Python一段程序中使用多次事件循环的相关内容,我们在Python异步程序编写中经常要用到如下的结构 import asyncio async def doAsync(): await asyncio.sleep(0) #... if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(doAsync()) loop.close() 这当然是很不

  • 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    一,node.js的作用, I/O的意义,(I/O是输入/输出的简写,如:键盘敲入文本,输入,屏幕上看到文本显示输出.鼠标移动,在屏幕上看到鼠标的移动.终端的输入,和看到的输出.等等)   node.js想解决的问题,(处理输入,输入,高并发 .如 在线游戏中可能会有上百万个游戏者,则有上百万的输入等等)(node.js适合的范畴:当应用程序需要在网络上发送和接收数据时Node.js最为适合.这可能是第三方的API,联网设备或者浏览器与服务器之间的实时通信)   并发的意义,(并发这个术语描述的

  • 详解nodejs异步I/O和事件循环

    事件驱动模型 现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的. nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处理过程基本上就是去调用该消息对应的回调函数.消息队列就是当一个事件状态发生变化时,就将一个消息压入队列中. nodejs的时间驱动模型一般要注意下面几个点: 因为是单线程的,所以当顺序执行js文件中的代码的时候,事件循环是被暂停的. 当js文件执行完以后,事

  • 浅谈Node 异步IO和事件循环

    前言 学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的知识整理清楚, 如有错误, 请指点轻喷~~ 一些概念  同步异步 & 阻塞非阻塞 查阅资料的时候, 发现很多人都对 异步和非阻塞 的概念有点混淆, 其实两者是完全不同的, 同步异步指的是 行为即两者之间的关系 , 而阻塞非阻塞指的是 状态即某一方 . 以前端请求为一个例子,下面的代码很多人都应该写过 $.ajax(

  • JavaScript事件循环同步任务与异步任务

    目录 前言 执行栈与任务队列 执行栈 任务队列 同步任务与异步任务 同步任务 异步任务 js的执行机制 结语 前言 首先,在学习js中同步异步的问题前,需要明白,js是单线程的,为什么它得是单线程的呢?这得从它的使用场景来看了,它主要是用来让用户与页面进行交互的吧.那么假设js是多线程的,在这个线程里面,用户点击某个按钮会增加一个DOM节点,在另一个线程里面,用户点击这个按钮又会删除一个DOM节点,那么此时js就不知道该听谁的了.那同步异步的出现又是为了什么呢?假设没有异步,那么我们在向服务器请

  • 详解Python的Twisted框架中reactor事件管理器的用法

    铺垫 在大量的实践中,似乎我们总是通过类似的方式来使用异步编程: 监听事件 事件发生执行对应的回调函数 回调完成(可能产生新的事件添加进监听队列) 回到1,监听事件 因此我们将这样的异步模式称为Reactor模式,例如在iOS开发中的Run Loop概念,实际上非常类似于Reactor loop,主线程的Run Loop监听屏幕UI事件,一旦发生UI事件则执行对应的事件处理代码,还可以通过GCD等方式产生事件至主线程执行. 上图是boost对Reactor模式的描绘,Twisted的设计就是基于

随机推荐