-
python基础教程之Python3标准库:asyncio异步I/O、事件循环和并发工具(2)
前面的例子使用生成器函数而不是原生协程重新实现。
1.3 调度常规函数调用
除了管理协程和/O回调,asyncio事件循环还可以根据循环中保存的一个定时器值来调度常规函数调用。
1.3.1 迅速调度一个回调
如果回调的时间不重要,那么可以用callsoon()调度下一次循环迭代的调用。调用回调时,函数后面额外的位置参数会传入回调。要向回调传入关键字参数,可以使用functools模块的partial()。
- import asyncio
- import functools
- def callback(arg, *, kwarg='default'):
- print('callback invoked with {} and {}'.format(arg, kwarg))
- async def main(loop):
- print('registering callbacks')
- loop.call_soon(callback, 1)
- wrapped = functools.partial(callback, kwarg='not default')
- loop.call_soon(wrapped, 2)
- await asyncio.sleep(0.1)
- event_loop = asyncio.get_event_loop()
- try:
- print('entering event loop')
- event_loop.run_until_complete(main(event_loop))
- finally:
- print('closing event loop')
- event_loop.close()
回调会按其调度的顺序来调用。
1.3.2 用Delay调度回调
要将一个回调推迟到将来某个时间调用,可以使用call_later()。这个方法的第一个参数是推迟时间(单位为秒),第二个参数是回调。
- import asyncio
- def callback(n):
- print('callback {} invoked'.format(n))
- async def main(loop):
- print('registering callbacks')
- loop.call_later(0.2, callback, 1)
- loop.call_later(0.1, callback, 2)
- loop.call_soon(callback, 3)
- await asyncio.sleep(0.4)
- event_loop = asyncio.get_event_loop()
- try:
- print('entering event loop')
- event_loop.run_until_complete(main(event_loop))
- finally:
- print('closing event loop')
- event_loop.close()
在这个例子中,同一个回调函数调度了多次,每次提供了不同的参数。最后一个调用使用了call_soon(),这会在所有按时间调用的实例之前基于参数3来调用这个回调,由此可以看出“迅速”调用的延迟往往最小。
1.3.3 在指定时间内调度一个回调
还可以安排在指定时间内调度一个调用。实现这个目的的循环依赖于一个单调时钟,而不是墙上时钟时间,以确保“now”时间绝对不会逆转。要为一个调度回调选择时间,必须使用循环的time()方法从这个时钟的内部状态开始。
- import asyncio
- import time
- def callback(n, loop):
- print('callback {} invoked at {}'.format(n, loop.time()))
- async def main(loop):
- now = loop.time()
- print('clock time: {}'.format(time.time()))
- print('loop time: {}'.format(now))
- print('registering callbacks')
- loop.call_at(now + 0.2, callback, 1, loop)
- loop.call_at(now + 0.1, callback, 2, loop)
- loop.call_soon(callback, 3, loop)
- await asyncio.sleep(1)
- event_loop = asyncio.get_event_loop()
- try:
- print('entering event loop')
- event_loop.run_until_complete(main(event_loop))
- finally:
- print('closing event loop')
- event_loop.close()
需要注意,循环的时间与time.time()返回的值并不一致。
1.4 异步的生成结果
Future表示还未完成的工作的结果。事件循环可以通过监视一个Future对象的状态来指示它已经完成,从而允许应用的一部分等待另一部分完成一些工作。
1.4.1 等待future
Future的做法类似于协程,所以等待协程所用的技术同样可以用于等待future被标记为完成。下面的例子将future传递到事件循环的run_until_complete()方法。
- import asyncio
- def mark_done(future, result):
- print('setting future result to {!r}'.format(result))
- future.set_result(result)
- event_loop = asyncio.get_event_loop()
- try:
- all_done =
栏目列表
最新更新
如何使用OS模块中的stat方法
Python os 模块
seek() 方法
python打开文件实例1
Python写入文件
什么是流?
文件操作如何进制逐行读取
Python相对路径
with创建临时运行环境
Python文件操作
.Net Standard(.Net Core)实现获取配置信息
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
access教程之Access简介
mysql 安装了最新版本8.x版本后的报错:
Mysql空间数据&空间索引(spatial)
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
数据定义功能
数据操作功能