1.什么是协程?
协程: 协程,又称微线程,纤程,英文名Coroutine。协程的作用,是在执行函数A时,可以随时中断,去执行函数B,然后中断继续执行函数A(可以自由切换)。但这一过程并不是函数调用(没有调用语句),这一整个过程看似像多线程,然而协程只有一个线程执行.
协程由于由程序主动控制切换,没有线程切换的开销,所以执行效率极高。对于IO密集型任务非常适用,如果是cpu密集型,推荐多进程+协程的方式。
协程,又称微线程。
2.协程的特点
协程的主要特色是:
协程间是协同调度的,这使得并发量数万以上的时候,协程的性能是远远高于线程。
注意这里也是“并发”,不是“并行”。
常用库:greenlet gevent
3.协程的优缺点
协程的优点
1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
2. 单线程内就可以实现并发的效果,最大限度地利用cpu
协程缺点:
1.协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
2.协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
4.基础代码演示:
import asyncio
import time
async def job1():
# 协程延长拿过5s
print("第一个任务执行")
await asyncio.sleep(1)
print("第一个任务完毕")
async def job2():
print("第二个任务执行")
await asyncio.sleep(1)
print('第二个任务执行完毕')
async def main():
# 动态的声明协程对象
# tasks = [asyncio.ensure_future(job2()) for x in range(2)]
#
# 1.将任务添加到事件循环中
await asyncio.gather(job1(),job2())
# 2.将任务添加到事件循环中
# a1 = asyncio.create_task(job1())
# a2 = asyncio.create_task(job2())
# print("前置逻辑")
# await a1
# await a2
# 3.同步方法执行
# await job1()
# await job2()
if __name__ == '__main__':
asyncio.run(main())
5.结果
6.总结
协程是一种用户态的轻量级线程,协程的调度完全由用户控制,不像进程和线程是系统态,所以操作全局变量的时候,无需加锁,只需要判断资源状态即可,效率非常高,同时协程是单线程的,即可以共享内存,又不需要系统态的线程切换,同时也不会触发gil全局解释器锁,所以它性能比线程要高。具体使用场景和线程一样,适合io密集型任务,所谓io密集型任务就是大量的硬盘读写操作或者网络tcp通信的任务,一般就是爬虫和数据库操作,文件操作非常频繁的任务