python协程获取返回值(四种方式)

本文对比了asyncio库中async/await配合future、create_task和回调函数的不同获取返回值方式,包括确保future对象的result、使用loop的create_task以及带有回调的异步任务。通过实例展示了每种方法的执行流程和结果输出。

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

一、通过ensure_future获取,本质是future对象中的result方法

import asyncio
from functools import partial

async def talk(name):
	print("talk running!!!")
	await asyncio.sleep(1)
	return f"{name} talk"

async def sleep(work):
	print("sleep running!!!")
	await asyncio.sleep(0.1)
	return f"{work} sleep"

if __name__ == "__main__":
	# 通过ensure_future获取,本质是future对象中的result方法
	loop = asyncio.get_event_loop()
	get_future1 = asyncio.ensure_future(talk("Dog"))
	get_future2 = asyncio.ensure_future(sleep("Cat"))
	loop.run_until_complete(get_future1)
	loop.run_until_complete(get_future2)
	print(get_future1.result())
	print(get_future2.result())

打印结果:

talk running!!!
sleep running!!!
Dog talk
Cat sleep

二、使用loop自带的create_task,获取返回值

import asyncio
from functools import partial

async def talk(name):
	print("talk running!!!")
	await asyncio.sleep(1)
	return f"{name} talk"

async def sleep(work):
	print("sleep running!!!")
	await asyncio.sleep(0.1)
	return f"{work} sleep"

if __name__ == "__main__":
	# 使用loop自带的create_task,获取返回值
	loop = asyncio.get_event_loop()
	task1 = loop.create_task(talk("Dog"))
	task2 = loop.create_task(sleep("Cat"))
	loop.run_until_complete(task1)
	loop.run_until_complete(task2)
	print(task1.result())
	print(task2.result())

打印结果:

talk running!!!
sleep running!!!
Dog talk
Cat sleep

三、使用callback,一旦await地方的内容运行完,就会运行callback

import asyncio
from functools import partial

async def tack(name):
	print("talk running!!!")
	await asyncio.sleep(1)
	return f"{name} talk"

async def sleep(work):
	print("sleep running!!!")
	await asyncio.sleep(0.1)
	return f"{work} sleep"

def callback(value):
	print(f"主动抛出接收返回值:{value}")

if __name__ == "__main__":
	# 使用callback,一旦await地方的内容运行完,就会运行callback
	loop = asyncio.get_event_loop()
	task1 = loop.create_task(tack("Dog"))
	task2 = loop.create_task(sleep("Cat"))
	task1.add_done_callback(callback)
	task2.add_done_callback(callback)
	loop.run_until_complete(task1)
	loop.run_until_complete(task2)
	print(task1.result())
	print(task2.result())
	

打印结果:

talk running!!!
sleep running!!!
主动抛出接收返回值:<Task finished name='Task-2' coro=<sleep() done, defined at D:/python_files/py2022_02/Case01/ceshi.py:24> result='Cat sleep'>
主动抛出接收返回值:<Task finished name='Task-1' coro=<tack() done, defined at D:/python_files/py2022_02/Case01/ceshi.py:19> result='Dog talk'>
Dog talk
Cat sleep

四、使用partial这个模块向callback函数中传入值

import asyncio
from functools import partial

async def talk(name):
	print("talk running !!!")
	await asyncio.sleep(1)
	return f"{name} talk"

async def sleep(work):
	print("sleep running!!!")
	await asyncio.sleep(0.1)
	return f"{work} sleep"
	
def callback(value):
    print(f"主动抛出接收返回值:{value}")

if __name__ == "__main__":
	# 使用partial这个模块向callback函数中传入值
	loop = asyncio.get_event_loop()
	task1 = loop.create_task(talk("Dog"))
	task2 = loop.create_task(sleep("Cat"))
	task1.add_done_callback(partial(callback))
	task2.add_done_callback(partial(callback))
	loop.run_until_complete(task1)
	loop.run_until_complete(task2)
	print(task1.result())
	print(task2.result())

打印结果:

talk running !!!
sleep running!!!
主动抛出接收返回值:<Task finished name='Task-2' coro=<sleep() done, defined at D:/python_files/py2022_02/Case01/ceshi.py:25> result='Cat sleep'>
主动抛出接收返回值:<Task finished name='Task-1' coro=<talk() done, defined at D:/python_files/py2022_02/Case01/ceshi.py:19> result='Dog talk'>
Dog talk
Cat sleep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值