python如何定时异步执行任务

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

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

原文发布于微信公众号 - 猿媛牧场(xpchuiit)

原文发表时间:2018-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏康怀帅的专栏

C Linux 下的编译

本文简要介绍了 C 语言的编译命令。 Hello World! #include <stdio.h> int main() { printf("...

3065
来自专栏IMWeb前端团队

json-schema入门

json-schema(一) 相关知识点 它是什么 描述json的数据格式 有什么优点 描述自定义的数据格式 清晰,对人和机器友好 完整的结构校验 自动化测试 ...

4060
来自专栏大闲人柴毛毛

Java并发编程的艺术(五)——中断

什么是中断? 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程的机制——中断。 中断...

3527
来自专栏云计算教程系列

如何使用Grep

Grep是一个命令行实用程序,可以使用常见的正则表达式语法搜索和过滤文本。它无处不在,动词“to grep”已经成为“搜索”的同义词。它grep是一个有用的工具...

1003
来自专栏hbbliyong

Gulp使用指南

发上来好像格式都变了,有需要的可以给留言,我把为知笔记发给大家!大家如果看着费劲就拉到最后直接看图片部分! 一.基本介绍 gulp是前端开发过程中一种基于流的代...

2956
来自专栏chenssy

【死磕Java并发】-----Java内存模型之happens-before

在上篇博客(【死磕Java并发】—–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性...

1162
来自专栏hbbliyong

你真的了解如何将 Nginx 配置为Web服务器吗

阅读之前,建议先阅读初识 Nginx。 之后,我们来了解一下 Nginx 配置。 抽象来说,将 Nginx 配置为 Web 服务器就是定义处理哪些 URLS 和...

5097
来自专栏开发与安全

X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

3700
来自专栏java一日一条

Java编程常见问题汇总2

这里有一个前提,就是文件大小不能讲JVM的heap撑爆。否则就等着OOM吧,尤其是在高并发的服务器端代码。最好的做法是采用Stream的方式边读取边存储(本地文...

861
来自专栏海天一树

小朋友学Python(7):输入与输出

一、print与input print "a =", a = input() print "b =" b = input() print "c =", c = ...

28410

扫码关注云+社区