协程 *单线程实现并发
进程:资源单位
线程:执行单位
协程:单线程下实现并发
并发:切换 + 保存状态
ps:看起来像同时执行的就可以称之为并发
协程:完全是程序员自己意淫出来的名词
单线程下实现并发
并发的条件?
多道技术:
空间上的复用
时间上的复用
切换 + 保存状态
实现解释:
程序员自己通过代码自己 检测程序中的IO
一旦遇到IO自己通过代码 自动切换
给操作系统的感觉是你这个线程没有任何的IO
ps:欺骗操作系统,让它误认为你这个程序一直没有IO,从而保证程序在 运行态和就绪态来回切换,提升代码的运行效率
如何检测 IO ???
导入模块:from gevent import spawn
注意:gevent 模块没办法自动识别 time.sleep 等IO情况
需要你手动再配置一个参数 from gevent import monkey; monkey.patch_all()
# 以协程实现服务端并发为例:
import socket from gevent import spawn from gevent import monkey; monkey.patch_all() # # 由于该模块经常被使用 所以建议写成一行 def run(conn): while True: try: data = conn.recv(1024) print(data.decode('utf-8')) conn.send(data.upper()) except ConnectionResetError as e: print(e) break conn.close() server = socket.socket() server.bind(('127.0.0.1', 8083)) server.listen(5) def server1(): while True: conn, addr = server.accept() spawn(run, conn) # 直接执行 if __name__ == '__main__': g1 = spawn(server1) # spawn会检测所有的任务 有一个返回值 可以使用join方法 不然 spawn()里的函数就直接执行 g1.join()
###################################################
切换 + 保存 状态就一定能够提升效率吗???分情况讨论:
当你的任务是 IO密集型 的情况下 >>> 提升效率
如果你的任务是 计算密集型 的 >>> 降低效率
####################################################