基于协程的高并发服务端与大复习
基于协程的高并发服务端
服务端代码:
from gevent import monkey,spawn;monkey.patch_all()
from socket import socket
def make_server(ip, port):
server = socket()
server.bind((ip, port))
server.listen(5)
while True:
conn, addr = server.accept()
spawn(task,conn) # 这里还需要join吗?不能加,我们不希望它夯在这
def task(conn):
while True:
# bytes.upper() # 顺带说一嘴之这两个upper方法是完全不同的两个方法,只是长得一样
# str.upper()
try:
data = conn.recv(1024)
if len(data) == 0: break
print(data)
conn.send(data.upper())
except Exception as e:
print(e)
break
conn.close()
if __name__ == '__main__':
# make_server('127.0.0.1',8080)
g=spawn(make_server,'127.0.0.1',8080)
g.join()
用于测试的创建5000个多线程客户端代码:
from socket import socket
from threading import Thread,current_thread
def task():
cli = socket()
cli.connect(('127.0.0.1', 8080))
while True:
ss='%s say hello'%current_thread().name
cli.send(ss.encode('utf-8'))
data = cli.recv(1024)
print(data)
for i in range(5000): # 都能连接上
t=Thread(target=task)
t.start()
并发编程大复习
操作系统发展史(了解)
多道技术(了解)
进程调度(了解)
-进程状态:就绪,执行,阻塞
进程三状态(就绪,阻塞,运行)
同步异步 阻塞非阻塞:异步+非阻塞
-同步是任务提交了,等待执行完成
-异步是任务提交了,不等待执行完成,我自己去干自己的事,任务完成有回调
-阻塞:程序运行的状态阻塞(io操作)
-非阻塞:程序一直在运行的状态
创建进程的两种方式(重点)
-资源分配的最小单位
-两种方式
-windows下开进程,在main函数下
进程join方法
-等待子进程执行完成,父进程再继续执行
进程间数据相互隔离
-因为开启一个进程,其实本身就是拉起一个python解释器,把进程跑在里面
僵尸进程与孤儿进程
-进程死了,还有数据每回收
-父进程死了,子进程就是孤儿进程
进程对象及其他方法
-进程id号,父进程id号,关闭进程,查看进程是否存活
守护进程
-主进程结束,守护进程跟着结束
互斥锁
-Lock
-获得锁
-释放锁
队列介绍
-进程Queue
-放值,取值
-放满了,取没了(阻塞,报错)
IPC机制
-进程间通信(队列机制)
GIL与普通互斥锁的区别
-全局解释器锁,垃圾回收线程,不是数据安全的,线程必须拿到GIL锁,才能执行
-GIL不能保证我们自己的数据安全,自己的数据安全需要自己处理锁
-io密集型:线程
-计算密集型:进程
多线程与多进程比较
-进程是资源分配的最小单位
-cpu执行(调度)的最小单位
-每个进程里至少有一条线程
死锁现象
-A这把锁,连续获得,第二次获得,就会夯住,形成死锁
-A线程已经获取A锁,等待去获取B锁,但是B锁被B线程获得,B线程在等待A锁
递归锁(可重入锁)
-同一条线程,可以重复获得这把锁,每获得一次数字加一,只有计数为0,其他线程才能获得
-解决死锁现象的第二种:A和B是同一把锁
信号量
-运行多条线程同时修改数据
Event事件
-发一个信号event.set(),原来在等待的(event.wait())线程会继续执行
线程q
-三种,先进先出,先进后出,优先级(越小)
池的概念
-用来做缓冲,不会一次性创建出很多(进程,链接),池子多大,最多就创建多少
线程池
-类不一样,用法完全一样
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
pool=ThreadPoolExecutor(5)
pool.submit(任务).add_done_callback(函数)
协程基本原理
-单线程下实现并发,程序员制造出来的,切换+保存状态
gevent模块
协程实现tcp并发
io模型介绍
阻塞io模型
非阻塞io模型理论
io多路复用
asyncio模块
io模型
面向对象大复习
类与对象
-class Person():
-p=Person()
属性查找
-p.name:先找对象自己,找不到去类中找,再找不到报错
类属性和对象属性
-分别再不同的名称空间
对象的绑定方法
-特殊之处,对象来调用,会自动传值,把对象自己传过来,当那个对象来调用,self就是谁
-类也可以来调用,类调用就是普通函数,有几个参数就要传几个参数
函数和方法
-
类与数据类型(类即类型)
-
类的继承(python支持多继承)
继承后属性查找顺序
派生(子类中新定义的属性或方法)
super() == 特殊的对象
多继承下的super(FatBossGril.__mro__)
组合(属性的值是指向另外一个类的对象)
多态与多态性
-多态指的是一类事物有多种形态
-多态性:一种调用方式,不同的执行效果
封装,隐藏属性
把一个对象放到另一个对象中就叫封装
有什么用?只需要拿到一个对象,里面就有很多属性和方法
property
类方法,对象方法,静态方法
isinstance和issubclass(son, father)
isinstance与type
isinstance(A,(B,)):可以判断A是否是B的派生 类或对象
type(A):输出A的父类 或实例化出A的类
-type:所有类的类,但是继承object
-object:所有类的父类,同时由type生成
一切皆对象之函数对象
新的魔术方法
反射getattr,setattr,hasattr,delattr