协程
协程 由于GIL锁导致CPython中多线程无法并发执行,只能并发执行。而并发实现的原理就是切换+保存,那就意味着多线程实现并发,就需要为每一个任务创建一个线程。那就出现了两个问题: 问题一:必然增加了线程创建销毁与切换带来的资源开销。 问题二:高并发情况下,由于任务数量太多导致无法开启新的线程,使得即没有实际任务要执行,也无法创建新线程来处理新任务的情况。 所以应想办法避免创建线程带来的问题,同时又能保证并发效果,==协程就是使用单线程来实现多任务并发==。 协程的本质是程序员自己通过代码自己检测程序中的IO,一旦遇到IO自己通过代码切换,给操作系统的感觉是你这个线程没有任何的IO。 ps:欺骗操作系统,让它误认为你这个程序一直没有IO,从而保证了程序在运行状态和就绪态来回切换,从而提升代码的运行效率。 单线程实现并发 并发 = 切换任务+保存状态。python中的生成器就具备这样一个特定,每次调用next都会回到生成器函数中执行代码,并且是基于上一次运行的结果,这就意味着生成器会自动切换任务并保存执行状态。 # 利用生成器实现单线程的并发效果 def task1(): while True: yield print("task1 run") def task2(): g = task1() while True: next(g) print("task2 run") task2