进程:资源单位
线程:执行单位
协程:单线程下实现并发
并发:切换 + 保存状态
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密集型 的情况下 >>> 提升效率
如果你的任务是 计算密集型 的 >>> 降低效率
####################################################