在学习Javascript的时候随处可见的异步回调,我在思考Python 是否也可以实现异步回调。前几次的学习明白了Python利用协程实现异步的方法,那接下来实现回调不就简单了吗?记录学习过程。
Python 3.7
一、正常的回调
import time
import asyncio
#这是一个回调函数
def callback(ret,err):
print("显示回调结果:",end="\n")
print(ret,err)
# 带有回调功能的函数
def task_b(arg_1,callback):
print("我是任务b,我需要执行5秒,执行结束有回调。",end="\n")
ret = ""
err = ""
time.sleep(5)
if arg_1 <5:
ret = arg_1
else:
err = "Error"
print("任务b执行结束")
callback(ret,err)
# 正常的函数 执行10秒
def task_a():
print("我是任务a,需要执行10秒,没有回调。",end="\n")
time.sleep(10)
print("任务a结束",end="\n")
if __name__ == '__main__':
task_b(2,callback)
task_a()
结果:
二、异步回调
import time
import asyncio
#这是一个回调函数
def callback(ret,err):
print("显示回调结果:",end="\n")
print(ret,err)
# 带有回调功能的函数
def task_b(arg_1,callback):
print("我是任务b,我需要执行5秒,执行结束有回调。",end="\n")
ret = ""
err = ""
time.sleep(5)
if arg_1 <5:
ret = arg_1
else:
err = "Error"
print("任务b执行结束")
#开始调用回调函数
callback(ret,err)
# 正常的函数 执行10秒
def task_a():
print("我是任务a,需要执行10秒,没有回调",end="\n")
time.sleep(10)
print("任务a结束",end="\n")
# 创建协程函数实现异步
async def async_task_a():
future = loop.run_in_executor(None,task_a)
response = await future
# 创建协程函数实现异步
async def async_task_b(arg_1):
future = loop.run_in_executor(None,task_b,arg_1,callback)
response = await future
if __name__ == '__main__':
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(async_task_a()),asyncio.ensure_future(async_task_b(2))]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
结果: