异步编程:看完其异步函数表
简介
本文简介python中的异步库中的函数。 站在巨人的肩上。
1 低层级 asyncio 索引
低层级 API 索引¶
列出所有低层级的 asyncio API。
1.1 获取事件循环
获取当前运行的事件循环 首选 函数:
asyncio.get_running_loop()
获得一个事件循环实例(当前或通过策略):
asyncio.get_event_loop()
通过当前策略将事件循环设置当前事件循环:
asyncio.set_event_loop()
创建一个新的事件循环:
asyncio.new_event_loop()
例子:
使用asyncio.get_running_loop()
1.2 事件循环方法集
- 查阅
事件循环方法 相关的主要文档段落 。生命周期
运行一个期程/任务/可等待对象直到完成:
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()。
1.3 传输
所有传输都实现以下方法:
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() 等方法返回。
1.3.1 读取传输
返回 True ,如果传输正在接收:
transport.is_reading()
暂停接收:
transport.pause_reading()
继续接收:
transport.resume_reading()
传输可以发送数据(TCP和Unix链接,管道等)。它通过 loop.create_connection(), loop.create_unix_connection(), loop.connect_write_pipe() 等方法返回。
1.3.2 写入传输
向传输写入数据:
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() 返回的传输:
1.3.3 数据报传输
发送数据到远程链接端:
transport.sendto()
立即关闭传输:
transport.abort()
基于子进程的底层抽象传输,它由 loop.subprocess_exec() 和 loop.subprocess_shell() 返回:
1.3.4 子进程传输
返回子进程的进程ID:
transport.get_pid()
返回请求通信管道 (stdin, stdout, 或 stderr)的传输:
transport.get_pipe_transport()
返回子进程的返回代号:
transport.get_returncode()
杀死子进程:
transport.kill()
发送一个信号到子进程:
transport.send_signal()
停止子进程:
transport.terminate()
杀死子进程并关闭所有管道:
transport.close()
1.3.5 协议
协议类可以由下面 回调方法 实现:
连接建立时被调用:
callback connection_made()
连接丢失或关闭时将被调用:
callback connection_lost()
传输的缓冲区超过高位标记位时被调用:
callback pause_writing()
传输的缓冲区传送到低位标记位时被调用:
callback resume_writing()
1.3.6 流协议 (TCP, Unix 套接字, 管道)
接收到数据时被调用:
callback data_received()
接收到EOF时被调用:
callback eof_received()
1.3.7 缓冲流协议
调用后会分配新的接收缓冲区:
callback get_buffer()
用接收的数据更新缓冲区时被调用:
callback buffer_updated()
接收到EOF时被调用:
callback eof_received()
1.3.8 数据报协议
接收到数据报时被调用:
callback datagram_received()
前一个发送或接收操作引发 OSError 时被调用:
callback error_received()
1.3.9 子进程协议
子进程向 stdout 或 stderr 管道写入数据时被调用:
callback pipe_data_received()
与子进程通信的其中一个管道关闭时被调用:
callback pipe_connection_lost()
子进程退出时被调用:
callback process_exited()
事件循环策略
策略是改变 asyncio.get_event_loop() 这类函数行为的一个底层机制。更多细节可以查阅 策略部分。
访问策略
asyncio.get_event_loop_policy()
返回当前进程域的策略。
asyncio.set_event_loop_policy()
设置一个新的进程域策略。
AbstractEventLoopPolicy
策略对象的基类。
2 高层 API索引
列举了所有能用于 async/wait 的高层级asyncio API 集。
2.1 任务
运行异步程序,创建Task对象,等待多件事运行超时的公共集。
run()
创建事件循环,运行一个协程,关闭事件循环。
create_task()
启动一个asyncio的Task对象。
await sleep()
休眠几秒。
await gather()
并发执行所有事件的调度和等待。
await wait_for()
有超时控制的运行。
await shield()
屏蔽取消操作
await wait()
完成情况的监控器
current_task()
返回当前Task对象
all_tasks()
返回事件循环中所有的task对象。
Task
Task对象
to_thread()
在不同的 OS 线程中异步地运行一个函数。
run_coroutine_threadsafe()
从其他OS线程中调度一个协程。
for in as_completed()
用 for 循环监控完成情况。
例子
使用 asyncio.gather() 并行运行.
使用 asyncio.wait_for() 强制超时.
撤销协程.
asyncio.sleep() 的用法.
请主要参阅 协程与任务文档.
2 队列集
队列集被用于多个异步Task对象的运行调度,实现连接池以及发布/订阅模式。
先进先出队列
Queue
优先级队列:
PriorityQueue
后进先出队列:
LifoQueue
使用 asyncio.Queue 在多个并发任务间分配工作量.
2.1 子进程集
用于生成子进程和运行shell命令的工具包。
创建一个子进程:
await create_subprocess_exec()
运行一个shell命令:
await create_subprocess_shell()
比如使用 它执行一个shell命令.
请参阅 子进程 APIs 相关文档.
3 同步
能被用于Task对象集的,类似线程的同步基元组件。
互斥锁:
Lock
事件对象:
Event
条件对象:
Condition
信号量:
Semaphore
有界的信号量:
BoundedSemaphore
小结
使用异步库的例子
asyncio.Event 的用法.
请参阅asyncio文档 synchronization primitives.
异常
asyncio.TimeoutError
类似 wait_for() 等函数在超时时候被引发。请注意 asyncio.TimeoutError 与内建异常 TimeoutError 无关。
asyncio.CancelledError
当一个Task对象被取消的时候被引发。请参阅 Task.cancel()。
在取消请求发生的运行代码中如何处理CancelledError异常.
请参阅完整的 asyncio 专用异常 列表.
本文代码例子:
https://docs.python.org/zh-cn/3/library/asyncio-future.html#asyncio-example-future
- 点赞
- 收藏
- 关注作者
评论(0)