asyncio call_at,call_soon和call_later用法

# coding=utf-8

import asyncio
import functools
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [*] %(process)d %(processName)s %(message)s"
)


def callback01 (args, *, kwargs="defalut"):
    print(f"\t普通函数做为回调函数,获取参数:{args},{kwargs}")


def callback02 (n):
    print(f"\t callback02 {n} invoked")


def callback03 (n, loop):
    print(f"\t callback03 {n} 运行时间点{loop.time()}")


async def result1 ():
    print("\t这是result1协程")
    return "result1"


async def result2 (arg):
    print("\t这是result2协程")
    return f"result2接收了一个参数,{arg}"


async def main (loop):
    print("1.主协程------------------------------------------------")
    print("\t等待result1协程运行")
    res1 = await result1()  # 异步阻塞(等待另一个协程)
    print("\t等待result2协程运行")
    res2 = await result2(res1)  # 异步阻塞(等待另一个协程)
    await asyncio.sleep(1)
    
    print("2.注册callback01----------------------------------------")
    loop.call_soon(callback01, 1)
    # 改变函数的默认参数
    wrapped = functools.partial(callback01, kwargs="not defalut")
    loop.call_soon(wrapped, 2)
    await asyncio.sleep(0.1)
    
    print("3.注册callback02----------------------------------------")
    loop.call_later(0.2, callback02, 1)  # 延时去调用一个函数
    loop.call_later(0.1, callback02, 2)  # 第一个参数越小,越先执行。
    loop.call_soon(callback02, 3)  # 会在call_later之前执行,和它的位置在哪无关
    await asyncio.sleep(1)
    
    print("4.注册callback03----------------------------------------")
    now = loop.time()
    print("\t 当前的内部时间(循环时间):", now)
    loop.call_at(now + 0.1, callback03, 1, loop)  # 第一个参数的含义代表的是一个单调时间
    loop.call_at(now + 0.2, callback03, 2, loop)
    loop.call_soon(callback03, 3, loop)
    await asyncio.sleep(1)
    
    return (res1, res2)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        print("进入事件循环...")
        result = loop.run_until_complete(main(loop))
        print(f"获取返回值:{result}")
    finally:
        print("关闭事件循环...")
        loop.close()

输出:

进入事件循环...
1.主协程------------------------------------------------
	等待result1协程运行
	这是result1协程
	等待result2协程运行
	这是result2协程
2.注册callback01----------------------------------------
	普通函数做为回调函数,获取参数:1,defalut
	普通函数做为回调函数,获取参数:2,not defalut
3.注册callback02----------------------------------------
	 callback02 3 invoked
	 callback02 2 invoked
	 callback02 1 invoked
4.注册callback03----------------------------------------
	当前的内部时间(循环时间): 363699.437
	 callback03 3 运行时间点363699.437
	 callback03 1 运行时间点363699.546
	 callback03 2 运行时间点363699.625
获取返回值:('result1', 'result2接收了一个参数,result1')
关闭事件循环...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值