昨天,我们介绍了在python3.5之后,对asyncio的操作,也初步认识了如何才能对网络进行异步请求。
今天我们就来讲下如何定时调用任务。
即刻生效
还记得昨天的 run_until_complete 吗,今天我们换个函数来用,call_soon
call_soon 支持在下一次事件循环的迭代中执行提供的回调函数。回调函数只能传递位置参数,如果想指定关键字参数的话,可以使用 functools.partial 函数来辅助使用。
import asyncio
import functools
# 下面我们将借助partial函数来说明如何使用关键字参数
def callback(arg, *, kwarg='default'):
print(f'callback with {arg} and {kwarg}')
async def main(loop):
print('register callbacks')
# 还是通过get_event_loop 获取Eventloop
loop.call_soon(callback, 1)
# 使用partial函数,对kwarg参数进行控制
wrapped = functools.partial(callback, kwarg='not default')
loop.call_soon(wrapped, 2)
# 上一篇中说过的,await用于等待,sleep也不是time.sleep
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()
对于partial函数不熟悉的同学,可以移步《不会用partial,别说你会python》
执行结果如下:
延迟执行
可以使用 call_later 方法实现延迟多少秒后执行回调函数。call_later 的第一个参数是延迟多少秒,第二个参数是回调函数,后面的参数是回调函数的位置参数
import asyncio
def callback(n):
print(f'callback with {n}')
async def main(loop):
print('register callbacks')
# 延迟0.2秒执行
# 执行完后调用callback函数
# callback的参数n
loop.call_later(0.2, callback, 1)
loop.call_later(0.1, callback, 2)
# 再来看下和call_soon的区别
loop.call_soon(callback, 3)
await asyncio.sleep(0.4)
event_loop = asyncio.get_event_loop()
try:
print('starting event_loop')
event_loop.run_until_complete(main(event_loop))
finally:
print('closing event_loop')
event_loop.close()
执行结果如下:
指定时间执行
可以使用 call_at 方法实现在将来指定的某个时间执行回调函数。call_at 的第一个参数是执行的时间点,第二个参数是回调函数,后面的参数是回调函数的位置参数。有一点需要注意的是不要使用 time 或 datetime 模块的时间点,而是要使用 loop.time() 获取当前时间。
import asyncio
import time
def callback(n, loop):
print(f'callback with {n} at {loop.time()}')
async def main(loop):
# 使用loop.time 而不是time和datetime模块
now = loop.time()
print(f'time模块的时间: {time.time()}')
print(f'loop.time的时间: {now}')
print('register callbacks')
# 使用call_at指定当前时间后的0.2秒执行
# 执行完了回掉callback
# callback的n和loop参数
loop.call_at(now + 0.2, callback, 1, loop)
loop.call_at(now + 0.1, callback, 2, loop)
# 和call_soon对比一下
loop.call_soon(callback, 3, loop)
await asyncio.sleep(1)
event_loop = asyncio.get_event_loop()
try:
print('starting event_loop')
event_loop.run_until_complete(main(event_loop))
finally:
print('closing event_loop')
event_loop.close()
执行结果如下:
好啦,今天的内容就到这了,所有的代码都已上传至我的github中。
github:https://github.com/MiracleYoung/exercises
如果你对今天的内容还感兴趣的话,何不点个赞再走呢?如果感兴趣到想赞赏我,就不要犹豫啦~
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有