异步包asyncio底层索引

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
应用实时监控服务-应用监控,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 【6月更文挑战第27天】探索asyncio低层级API:包括信号处理、错误处理和传输控制。别忘了事件循环策略,影响`get_event_loop()`行为。

1 低级 asyncio 索引

低层级 API 索引 ,这里列出所有低层级的 asyncio API,主要包括:获取事件循环如asyncio.get_running_loop(),调度任务如run_until_complete(),管理事件循环、任务、未来对象,及套接字、子进程交互。

treeoflife6.png

2 获取事件循环

获取当前运行的事件循环 首选 函数:

asyncio.get_running_loop() 

获得一个事件循环实例(当前或通过策略):

asyncio.get_event_loop()

通过当前策略将事件循环设置当前事件循环:

asyncio.set_event_loop()

创建一个新的事件循环:

asyncio.new_event_loop()

例子:

使用asyncio.get_running_loop()

3 事件循环方法集

  • 查阅

事件循环方法 相关的主要文档段落 。生命周期

运行一个期程/任务/可等待对象直到完成:

loop.run_until_complete()

一直运行事件循环:

loop.run_forever()

停止事件循环:

loop.stop()

关闭事件循环:

loop.close()

返回 True , 如果事件循环正在运行:

loop.is_running()

返回 True ,如果事件循环已经被关闭:

loop.is_closed()

关闭异步生成器:

await loop.shutdown_asyncgens()
  • 调试:

开启或禁用调试模式:

loop.set_debug()

获取当前测试模式:

loop.get_debug()

调度回调函数:

loop.call_soon()

尽快调用回调:

loop.call_soon_threadsafe()

方法线程安全的变体:

    loop.call_soon() 

在给定时间 之后 调用回调函数:

loop.call_later()

在 指定 时间调用回调函数:

loop.call_at()
  • 线程/进程池

在 concurrent.futures 执行器中运行一个独占CPU或其它阻塞函数:

await loop.run_in_executor()

设置 loop.run_in_executor() 默认执行器:

loop.set_default_executor()
  • 任务与期程

创建一个 Future 对象:

loop.create_future()

将协程当作 Task 一样调度:

loop.create_task()

设置 loop.create_task() 使用的工厂,它将用来创建 Tasks:

loop.set_task_factory()

获取 loop.create_task() 使用的工厂,它用来创建 Tasks:

loop.get_task_factory()

异步版的 socket.getaddrinfo():

await loop.getaddrinfo()

异步版的 socket.getnameinfo():

await loop.getnameinfo()
  • 网络和IPC

打开一个TCP链接:

await loop.create_connection()

创建一个TCP服务:

await loop.create_server()

打开一个Unix socket连接:

await loop.create_unix_connection()

创建一个Unix socket服务:

await loop.create_unix_server()

将 socket 包装成 (transport, protocol) 对:

await loop.connect_accepted_socket()

打开一个数据报(UDP)连接:

await loop.create_datagram_endpoint()

通过传输通道发送一个文件:

await loop.sendfile()

将一个已建立的链接升级到TLS:

await loop.start_tls()

将管道读取端包装成 (transport, protocol) 对:

await loop.connect_read_pipe()

将管道写入端包装成 (transport, protocol) 对:

await loop.connect_write_pipe()
  • 套接字

从 socket 接收数据:

await loop.sock_recv()

从 socket 接收数据到一个缓冲区中:

await loop.sock_recv_into()

发送数据到 socket :

await loop.sock_sendall()

链接 await loop.sock_connect() :

await loop.sock_connect()

接受一个 socket 链接:

await loop.sock_accept()

利用 socket 发送一个文件:

await loop.sock_sendfile()

开始对一个文件描述符的可读性的监视:

loop.add_reader()

停止对一个文件描述符的可读性的监视:

loop.remove_reader()

开始对一个文件描述符的可写性的监视:

loop.add_writer()

停止对一个文件描述符的可写性的监视:

loop.remove_writer()
  • Unix信号

给 signal 添加一个处理回调函数:

loop.add_signal_handler()

删除 signal 的处理回调函数:

loop.remove_signal_handler()
  • 子进程集

衍生一个子进程:

loop.subprocess_exec()

从终端命令衍生一个子进程:

loop.subprocess_shell()
  • 错误处理

调用异常处理器:

loop.call_exception_handler()

设置一个新的异常处理器:

loop.set_exception_handler()

获取当前异常处理器:

loop.get_exception_handler()

默认异常处理器实现:

loop.default_exception_handler()
  • 例子

    使用 asyncio.get_event_loop() 和 loop.run_forever().

    使用 loop.call_later().

    使用 loop.create_connection() 实现 echo客户端.

    使用 loop.create_connection() 去 链接socket.

    使用add_reader()监听FD(文件描述符)的读取事件.

    使用loop.add_signal_handler().

    使用loop.add_signal_handler()。

4 传输

所有传输都实现以下方法:

transport.close()

关闭传输。

transport.is_closing()

返回 True ,如果传输正在关闭或已经关闭。

transport.get_extra_info()

请求传输的相关信息。

transport.set_protocol()

设置一个新协议。

transport.get_protocol()

返回当前协议。

传输可以接收数据(TCP和Unix链接,管道等)。它通过 loop.create_connection(), loop.create_unix_connection(), loop.connect_read_pipe() 等方法返回。

5 读取传输

返回 True ,如果传输正在接收:

transport.is_reading()

暂停接收:

transport.pause_reading()

继续接收:

transport.resume_reading()

传输可以发送数据(TCP和Unix链接,管道等)。它通过 loop.create_connection(), loop.create_unix_connection(), loop.connect_write_pipe() 等方法返回。

6 写入传输

向传输写入数据:

transport.write()

向传输写入缓冲:

transport.write()

返回 True ,如果传输支持发送 EOF:

transport.can_write_eof()

在冲洗已缓冲的数据后关闭传输和发送EOF:

transport.write_eof()

立即关闭传输:

transport.abort()

返回写入流控制的高位标记位和低位标记位:

transport.get_write_buffer_size()

设置新的写入流控制的高位标记位和低位标记位:

transport.set_write_buffer_limits()

由 loop.create_datagram_endpoint() 返回的传输:

7 数据报传输

发送数据到远程链接端:

transport.sendto()

立即关闭传输:

transport.abort()

基于子进程的底层抽象传输,它由 loop.subprocess_exec() 和 loop.subprocess_shell() 返回:

8 子进程传输

返回子进程的进程ID:

transport.get_pid()

返回请求通信管道 (stdin, stdout, 或 stderr)的传输:

transport.get_pipe_transport()

返回子进程的返回代号:

transport.get_returncode()

杀死子进程:

transport.kill()

发送一个信号到子进程:

transport.send_signal()

停止子进程:

transport.terminate()

杀死子进程并关闭所有管道:

transport.close()

9 协议

协议类可以由下面 回调方法 实现:

连接建立时被调用:

callback connection_made()

连接丢失或关闭时将被调用:

callback connection_lost()

传输的缓冲区超过高位标记位时被调用:

callback pause_writing()

传输的缓冲区传送到低位标记位时被调用:

callback resume_writing()

10 流协议 (TCP, Unix 套接字, 管道)

接收到数据时被调用:

callback data_received()

接收到EOF时被调用:

callback eof_received()

11 缓冲流协议

调用后会分配新的接收缓冲区:

callback get_buffer()

用接收的数据更新缓冲区时被调用:

callback buffer_updated()

接收到EOF时被调用:

callback eof_received()

12 数据报协议

接收到数据报时被调用:

callback datagram_received()

前一个发送或接收操作引发 OSError 时被调用:

callback error_received()

13 子进程协议

子进程向 stdout 或 stderr 管道写入数据时被调用:

callback pipe_data_received()

与子进程通信的其中一个管道关闭时被调用:

callback pipe_connection_lost()

子进程退出时被调用:

callback process_exited()

14 事件循环策略

策略是改变 asyncio.get_event_loop() 这类函数行为的一个底层机制。更多细节可以查阅 策略部分。

访问策略

asyncio.get_event_loop_policy()

返回当前进程域的策略。

asyncio.set_event_loop_policy()

设置一个新的进程域策略。

AbstractEventLoopPolicy

策略对象的基类。

目录
相关文章
|
网络协议 Python
在Python中进行UDP(User Datagram Protocol)网络编程
在Python中进行UDP(User Datagram Protocol)网络编程
278 3
|
SQL 分布式计算 NoSQL
【SQL 审核查询平台】Archery使用介绍
【SQL 审核查询平台】Archery使用介绍
820 0
【SQL 审核查询平台】Archery使用介绍
|
11月前
|
机器学习/深度学习 数据采集 存储
智能废水处理与监测的深度学习模型
智能废水处理与监测的深度学习模型
164 7
智能废水处理与监测的深度学习模型
|
存储 数据库
如何在数据库中存储小数:FLOAT、DECIMAL还是BIGINT?
【8月更文挑战第7天】在数据库中存储小数时,需谨慎选择数据类型:FLOAT、DECIMAL 或 BIGINT。FLOAT 存储空间小,适于非关键性小数如温度;但精度有限,可能产生误差。DECIMAL 能精确表示小数,适合货币金额等需要高度准确性的场景,不过占用空间较大。BIGINT 用于整数,若存储小数需额外转换处理。根据精度需求及应用场景选择合适类型至关重要。
595 2
|
Rust 安全 Java
Rust语言在Web后端的应用:基于Actix-web构建高性能、安全可靠的服务器实践
【8月更文挑战第31天】随着互联网的发展,Web应用对性能和安全性要求不断提高。Rust凭借卓越的性能、内存安全及丰富生态,成为构建高性能Web服务器的理想选择。本文通过一个简单示例,展示如何使用Rust和Actix-web框架搭建基本Web服务器,从创建项目到运行服务器全程指导,帮助读者领略Rust在Web后端开发中的强大能力。通过实践,读者可以体验到Rust在性能和安全性方面的优势,以及其在Web开发领域的无限潜力。
711 0
|
NoSQL 应用服务中间件 Linux
宝塔linux面板命令大全
宝塔linux面板命令大全
243 2
|
12月前
|
JSON API 数据库
json-server的简单使用
如何使用`json-server`来快速搭建一个模拟API服务,包括安装`json-server`、创建JSON数据文件、启动服务以及通过浏览器测试API的基本操作。
150 0
json-server的简单使用
|
11月前
|
网络协议 NoSQL 应用服务中间件
如何在 asyncio 中使用 socket
如何在 asyncio 中使用 socket
152 1
|
网络协议 API 调度
Python网络编程基础(Socket编程)asyncio库的使用
【4月更文挑战第12天】在Python的网络编程中,除了直接使用底层的Socket API,还有许多高级的网络编程库可以帮助我们更简洁、高效地构建网络应用。这些库通常提供了异步IO、事件循环、协议支持等功能,使得开发者能够更专注于业务逻辑的实现。其中,`asyncio`库是Python 3中引入的一个强大的异步IO库,它为我们提供了编写异步代码的基础设施。
|
负载均衡 API 微服务
深入浅出:使用Python构建微服务架构
本文旨在为读者提供一个清晰、易懂的指南,介绍如何使用Python语言构建微服务架构。微服务架构作为一种现代软件开发实践,能够提高大型应用的可维护性和可扩展性。通过本文,我们将探索微服务的基本概念、优势以及如何利用Python的强大生态系统进行微服务的设计与实现。我们会通过一个简单实例,演示从零开始构建微服务的全过程,包括服务的划分、通信机制、以及如何利用容器技术(如Docker)进行部署。此外,文章还将讨论在微服务架构下的常见挑战和最佳实践,旨在为读者提供一份全面而深入的实用指南。

热门文章

最新文章