python学习 day39之基于协程的高并发服务端与大复习

基于协程的高并发服务端

服务端代码:

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
类方法,对象方法,静态方法
isinstanceissubclass(son, father)
isinstancetype
isinstance(A,(B,)):可以判断A是否是B的派生 类或对象
type(A):输出A的父类 或实例化出A的类
 -type:所有类的类,但是继承object
 -object:所有类的父类,同时由type生成

一切皆对象之函数对象

新的魔术方法

反射getattr,setattr,hasattr,delattr

和和

__setattr__: 添加/修改属性会触发它的执行

__delattr__: 删除属性的时候会触发

__getattr__: 只有在使用点调用属性且属性不存在的时候才会触发

猜你喜欢

转载自blog.csdn.net/wuzeipero/article/details/108307158