python如何定时异步执行任务

640?wx_fmt=gif

昨天,我们介绍了在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

执行结果如下:

640?wx_fmt=jpeg


延迟执行

可以使用  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()
执行结果如下:

640?wx_fmt=jpeg

指定时间执行

可以使用  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()
执行结果如下:

640?wx_fmt=jpeg


好啦,今天的内容就到这了,所有的代码都已上传至我的github中。

github:https://github.com/MiracleYoung/exercises


如果你对今天的内容还感兴趣的话,何不点个赞再走呢?
如果感兴趣到想赞赏我,就不要犹豫啦~




目前我开了2个主群,我邀请了一些我的BAT伙伴前来助阵。定期也会在群里组织抽奖、送书等活动。更有各种资源分享。

目前2个主群都以过百,想要加入的小伙伴,可以加我微信,我拉你们,或者公众号回复关键“关注作者”。


另外高级群」已经升级啦!如果你错过了种子轮,难道还要错过天使轮吗?群内不定期组织红包接龙,每天中午1小时的随即话题讨论没有广告只聊技术生活,这样的群上哪找?

640?wx_fmt=jpeg

640?wx_fmt=jpeg

推荐阅读:
用python帮助你从此快起来!
如何通过一些骚操作有效的控制Python类

640?wx_fmt=jpeg

640?wx_fmt=jpeg

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值