import asyncio
import datetime
def display_date(end_time, loop):
print(datetime.datetime.now())
if (loop.time() + 1.0) < end_time:
loop.call_later(1, display_date, end_time, loop)
else:
loop.stop()
loop = asyncio.get_event_loop()
# Schedule the first call to display_date()
end_time = loop.time() + 5.0
loop.call_soon(display_date, end_time, loop)
# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()
定义函数 display_date ,
位置参数1 end_time,期望一个 float 类型的事件循环对象内部时间
位置参数2 loop,期望一个事件循环对象的引用
打印当前时间
如果事件循环对象的当前内部时间在 1 秒钟之后仍早于 end_time 持有的时间,则
调用 loop 变量引用的 even loop 对象之 call_later 方法
位置参数1 delay 给定延时时长,单位秒,类型为 int/float
位置参数2 callback 设置为 display_date 函数自身
可选位置参数 end_time 与 loop 即为 display_date 函数自身参数
该方法安排计划在给定的时间间隔后调用 callback
其返回的 asyncio.Handle 实例不留存
如若不然,则
调用 loop 变量引用的 even loop 对象之 stop 方法
停止事件循环
调用模组级方法 get_event_loop 获取以全局策略管理的事件循环对象
并将对象的引用赋予变量 loop
调用 loop 变量引用的 even loop 对象之 time 方法
获得事件循环对象的当前内部时间增加5秒间隔后
赋值予变量 end_time
调用 loop 变量引用的 even loop 对象之 call_soon 方法
位置参数1 callback 设置为 display_date 函数对象的引用
可选位置参数 end_time 与 loop 为 display_date 函数の参数
该方法安排计划一有可能即刻调用 callback
其返回的 asyncio.Handle 实例不留存
调用 loop 变量引用的 even loop 对象之 run_forever 方法
启动事件循环
调用 loop 变量引用的 even loop 对象之 close 方法
关闭事件循环
代码执行过程小结:
引入 asyncio 模块,准备回调函数,获取事件循环对象,获得该对象即获得了 AbstractEventLoop 接口的访问能力,随后使用接口注册回调函数安排调用计划,之后启动循环,display_date 函数被事件循环对象调用,display_date 函数依据参数判断注册回调函数安排延时调用计划或停止循环,在停止循环之后关闭循环。
备注
- 在 run_forever 与 close 之间,回调函数执行,直至 stop 后,run_forever 退出,close 执行。
参考
- Expcode - Hello World with call_soon
- asyncio Asynchronous I/O, event loop, coroutines and tasks
- Policy-based design