day33-2 协程
目录 协程 单线程实现并发 greenlet模块实现并发 gevent模块实现并发 协程与线程比较 协程 由于GIL锁导致在Cpython中多线程无法并行执行,只能并发执行。而并发实现的原理是切换+保存,那就意味着使用多线程实现并发,就需要为每一个任务创建一个线程 问题一:必然增加了线程创建销毁与切换带来的资源开销。 问题二:高并发情况下,由于任务数量太多导致无法开启新的线程,使得即没有实际任务要执行,也无法创建新线程来处理新任务的情况 所以应想办法避免创建线程带来的问题,同时又能保证并发效果, 协程就是使用单线程来实现多任务并发 单线程实现并发 并发 = 切换任务+保存状态。python中的生成器就具备这样一个特点,每次调用next都会回到生成器函数中执行代码,并且是基于上一次运行的结果,这就意味着生成器会自动切换任务并保存执行状态 def task1(): while True: yield print('task1 run') def task2(): g = task1() while True: next(g) print('task2 run') task2() 并发虽然实现了,但是效率如何呢? # 两个计算任务:一个采用生成器切换并发执行,一个直接串行调用 import time def task1(): a = 0 for i in range(50000000):