当前位置:
首页 > Python基础教程 >
-
Python3标准库:asyncio异步I/O、事件循环和并发工具(2)
.close()
前面的例子使用生成器函数而不是原生协程重新实现。
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 =
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式