基本使用
- async 包装函数创建一个协程
- await 可以针对耗时的操作进行挂起,类似
yield
,函数让出控制权
import asyncio
import time
from pprint import pprint
async def print_myself(name, slp):
print(f'My name is {name}')
await asyncio.sleep(slp)
return f"{name}函数已执行完毕"
def callback(future):
print("Callback: ", future.result())
coroutine1 = print_myself("cxs", 1)
coroutine2 = print_myself("cxw", 2)
coroutine3 = print_myself("clw", 3)
# 创建一个事件循环
loop = asyncio.get_event_loop()
"""
两种方式创建 future对象
"""
task = loop.create_task(coroutine)
# 或者
task = asyncio.ensure_future(coroutine)
tasks = [
asyncio.ensure_future(coroutine1),
asyncio.ensure_future(coroutine2),
asyncio.ensure_future(coroutine3),
]
# 判断类型
print(isinstance(tasks, asyncio.Future))
# 绑定回调函数,获取task返回值
task.add_done_callback(callback)
# 将协程注册进事件循环
loop.run_until_complete(asyncio.wait(tasks))
# 或者
loop.run_until_complete(asyncio.gather(*tasks))
loop.close()
配合多线程
import time
import asyncio
from threading import Thread, current_thread
def start_loop(loop):
"""
开启一个无限事件循环
"""
asyncio.set_event_loop(loop)
loop.run_forever()
def get_thread_name():
print("current thread name: ", current_thread())
async def coroutine_work(x):
"""
协程
"""
get_thread_name()
print("start: ", int(time.time()))
await asyncio.sleep(x)
end = time.time()
print(f"end: ", int(time.time()))
def common_work(x):
"""
普通函数
"""
get_thread_name()
start = time.time()
time.sleep(x)
end = time.time()
print(f"耗时{end - start}")
def main():
"""
主线程
"""
get_thread_name()
loop = asyncio.new_event_loop()
t = Thread(target=start_loop, args=(loop,)) # 子线程
t.start()
# 协程注册到事件循环
asyncio.run_coroutine_threadsafe(coroutine_work(4), loop)
asyncio.run_coroutine_threadsafe(coroutine_work(2), loop)
main()
'''
输出如下:
current thread name: <_MainThread(MainThread, started 36316)>
current thread name: <Thread(Thread-1, started 4136)>
start: 1654077800
current thread name: <Thread(Thread-1, started 4136)>
start: 1654077800
end: 1654077802
end: 1654077804
'''
从输出结果可以得出:
- 两个协程都是在子线程中运行,区别于主线程
- 两个协程是同时启动,并发运行的