昨天,我们介绍了在python3.5之后,对asyncio的操作,也初步认识了如何才能对网络进行异步请求。
今天我们就来讲下如何定时调用任务。
还记得昨天的 run_until_complete 吗,今天我们换个函数来用,call_soon
call_soon 支持在下一次事件循环的迭代中执行提供的回调函数。回调函数只能传递位置参数,如果想指定关键字参数的话,可以使用 functools.partial 函数来辅助使用。
import asyncioimport 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()
执行结果如下:
import asynciodef 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()
import asyncioimport timedef 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
目前我开了2个主群,我邀请了一些我的BAT伙伴前来助阵。定期也会在群里组织抽奖、送书等活动。更有各种资源分享。
目前2个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。
另外:「高级群」已经升级啦!如果你错过了种子轮,难道还要错过天使轮吗?群内不定期组织红包接龙,每天中午1小时的随即话题讨论,没有广告,只聊技术、生活,这样的群上哪找?
文章有问题?点此查看未经处理的缓存