协程(Coroutine),也可以称为微线程,是一种用户态内的上下文切换技术,其实就是通过一个线程实现代码相互切换执行。
对于for循环,是一个个按顺序执行,只有执行完当前的任务,才能执行下一个,如:
for i in range(5):
print(1)
time.sleep(2)
print(2)
这里的time.sleep(2)就好比在网络中发送出一个请求后,等待响应的过程,如果是传统的for循环,这2s的时间就只是在等待响应,而无法进行其他工作。但如果工作量大或者等待响应的时间过长,就可能造成资源的浪费。
那么进行协程编程,就可以在等待时,去执行其他的任务,这样就大大加快了任务的执行速度。
例如:
import time
def func():
print(1)
# time.sleep(2)好比一次较耗时的网络IO请求
time.sleep(2)
print(2)
if __name__ == '__main__':
time_start = time.time()
for i in range(4):
func()
time_end = time.time()
print('time cost', time_end - time_start, 's')
如果是常规的for循环,依次执行需要至少8s的时间。
但如果用asyncio异步编程,就会快许多:
import asyncio
import time
async def func():
print(1)
# 一次较耗时的网络IO请求
await asyncio.sleep(2)
print(2)
async def main():
task_list = [
asyncio.create_task(func()),
asyncio.create_task(func()),
asyncio.create_task(func()),
asyncio.create_task(func())
]
await asyncio.wait(task_list, timeout=None)
if __name__ == '__main__':
time_start = time.time()
asyncio.run(main())
time_end = time.time()
print('time cost', time_end - time_start, 's')
这样就只需要2s的时间了,因为在执行到sleep(2)时,当前的任务被挂起等待休眠2s,计算机转去执行其他任务了。
更多asyncio异步编程内容:asyncio异步编程