asyncio异步编程之Task对象

本文介绍了Python的asyncio模块中的Task对象,用于实现协程的并发执行。通过示例代码展示了如何创建Task,包括使用`asyncio.create_task`(Python 3.7+)和`asyncio.ensure_future`(Python 3.6及以下)。文中还解释了Task如何与事件循环配合,以及如何通过`asyncio.wait`管理并发任务。示例中包含多种并发任务的执行方式,帮助读者深入理解Task在并发控制中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1, Task对象的作用

可以将多个任务添加到事件循环当中,达到多任务并发的效果

2.如何创建task对象

asyncio.create_task(协程对象)

注意:create_task只有在python3.7及以后的版本中才可以使用,就像asyncio.run()一样,

在3.7以前可以使用asyncio.ensure_future()方式创建task对象

3.示例一(目前不推荐这种写法)

async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "test"


async def main():

    print("main start")
    
    # python 3.7及以上版本的写法
    # task1 = asyncio.create_task(func())
    # task2 = asyncio.create_task(func())
    
    # python3.7以前的写法
    task1 = asyncio.ensure_future(func())
    task2 = asyncio.ensure_future(func())
    print("main end")

    ret1 = await task1
    ret2 = await task2

    print(ret1, ret2)

# python3.7以后的写法
# asyncio.run(main())

# python3.7以前的写法
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

"""
在创建task的时候,就将创建好的task添加到了时间循环当中,所以说必须得有时间循环,才可以创建task,否则会报错
"""

4.示例2

async def func1():
    print(1111)
    await asyncio.sleep(2)
    print(2222)
    return "test"


async def main1():

    print("main start")

    tasks = [
        asyncio.ensure_future(func1()),
        asyncio.ensure_future(func1())
    ]

    print("main end")

    # 执行成功后结果在done中, wait中可以加第二个参数timeout,如果在超时时间内没有完成,那么pending就是未执行完的东西
    done, pending = await asyncio.wait(tasks, timeout=1)

    print(done)
    #print(pending)

# python3.7以前的写法
loop = asyncio.get_event_loop()
loop.run_until_complete(main1())

5,示例3(算是以上示例2的简化版)

"""
方式二的简化版,就是tasks中不直接添加task,而是先将协程对象加入到list中,在最后运行中添加
"""

async def func2():
    print(1111)
    await asyncio.sleep(2)
    print(2222)
    return "test"


tasks = [
    func2(),
    func2()
]

# python3.7以前的写法
loop = asyncio.get_event_loop()
done, pending = loop.run_until_complete(asyncio.wait(tasks))
print(done)
print(pending)

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值