ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
![](https://img.kancloud.cn/41/e0/41e066af9a6c25a24868d9667253ec98_1241x333.jpg) ***** ## Python多任务-协程 ### 同步、异步 同步:是指代码调用IO操作时,必须等待IO操作完成才返回的调用方式 异步:是指代码调用IO操作时,不必等IO操作完成就返回的调用方式 ### 阻塞、非阻塞 阻塞:从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞 非阻塞:从调用者的角度出发, 如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞 ### 生成器-send方法 send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值 ### 使用yield完成多任务 ~~~ import time def task1(): while True: print("--1--") time.sleep(0.1) yield def task2(): while True: print("--2--") time.sleep(0.1) yield def main(): t1 = task1() t2 = task2() while True: next(t1) next(t2) if __name__ == "__main__": main() ~~~ ### yield from介绍 python3.3新加了yield from语法 ~~~ def generator_1(): total = 0 while True: x = yield print('加', x) if not x: break total += x return total def generator_2(): # 委托生成器 while True: total = yield from generator_1() # 子生成器 print('加和总数是:', total) def main(): # 调用方 # g1 = generator_1() # g1.send(None) # g1.send(2) # g1.send(3) # g1.send(None) g2 = generator_2() g2.send(None) g2.send(2) g2.send(3) g2.send(None) if __name__ == '__main__': main() 【子生成器】:yield from后的generator_1()生成器函数是子生成器 【委托生成器】:generator_2()是程序中的委托生成器,它负责委托子生成器完成具体任务。 【调用方】:main()是程序中的调用方,负责调用委托生成器。 ~~~ ## 协程 协程,又称微线程 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源) Python中的协程大概经历了如下三个阶段: 1. 最初的生成器变形yield/send 2. yield from 3. 在最近的Python3.5版本中引入async/await关键字 ### 使用greenlet完成多任务 安装模块:pip3 install greenlet ### 使用gevent完成多任务 安装模块:pip3 install gevent ### 简单总结 * 进程是资源分配的单位 * 线程是操作系统调度的单位 * 进程切换需要的资源很最大,效率很低 * 线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下) * 协程切换任务资源很小,效率高 * 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发