• Python3 网络编程和并发编程总结


    网络编程

    开发架构

    • B/S: browser/server
    • C/S: client/server

    OSI七层模型

    • 应用层
    • 表示层
    • 会话层
    • 传输层: 建立端口到端口的通信, TCP/UDP协议
    • 网络层: 引入IP地址来进行跨局域网通信, 因特网协议
    • 数据链路层: 规定分组方式, 以太网协议(局域网), MAC地址
    • 物理层: 基于电信号发送二进制流

    socket

    • socket模块内部将OSI七层模型的复杂操作进行了封装

    subprocess

    • 远程向DOS系统发送指令, 并接受DOS系统返回的结果
    • subprocess.Popen('命令', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    粘包问题

    • 不确定对方发送数据的长度
    • 数据长度小, 发送间隔时间短的数据, 会被打包一次性发送
    • 通过struct模块解决粘包问题: 先发送一个包含数据长度的报头告知对方即将发送的数据的长度

    socketserver

    TCP

    • 流式协议
    • 需要建立双向连接( 三次挥手)
    • 反馈机制: 往对方发送数据, 必须要得到返回消息, 否则就会在一段时间内一直发送
    • 面向连接的可靠数据传输协议

    UDP

    • 面向数据的不可靠数据传输协议
    • 不需要建立双向通道
    • 传输速度快
    • 不会有粘包问题
    • 发送数据不需要得到对方返回消息

    并发编程

    多道技术

    • 单道: 内存中只存在一个任务
    • 多道: 内存中存在多个任务(分时交替运行, 切换+保存状态)

    并发和并行

    • 并发: 一段时间内执行多个任务, 这些任务分时交替运行
    • 并行: 一个时间点上可以运行多个任务

    进程

    • 程序: 数据和指令的集合, 静态的概念

    • 进程: 程序关于某个数据集合的一次运行, 动态的概念

    • 进程时操作系统进行资源分配的基本单位

    • 进程调度:

      1. 先来先服务: 谁先就绪就先执行谁
      2. 短作业优先: 谁的预计执行时间短就执行谁
      3. 时间片轮转法: 为每个进程分配一个时间段, 在这个时间段内执行该进程
      4. 分级反馈队列: 设置多个就绪队列, 设置不同的优先级
    • 进程的三种状态:

      1. 就绪态
      2. 执行态
      3. 阻塞态
    • 同步和异步: 面向被调用者的消息提醒机制

      1. 同步: 等有结果再返回
      2. 异步: 先返回, 再执行, 有结果再通知
    • 阻塞和非阻塞: 面向调用者的等待消息的状态

      1. 阻塞: 死等
      2. 非阻塞: 等待的同时可以干其他事情
    • 创建进程的两种方式:

      1. p=Process(target=函数名, args=(参数, ))
      2. class MyProcess(Process)--->def run(self)--->p=MyProcess()

    僵尸进程和孤儿进程

    • 僵尸进程: 进程结束了, pid没被回收
    • 孤儿进程: 子进程还行执行, 主进程异常结束

    守护进程

    • 主进程等待子进程结束再结束

    互斥锁

    • 将并发变为串行, 牺牲了执行效率, 保证可数据安全

    队列

    • 相当于一个数据中转站, 可以实现多进程传入或者获取数据(先进先出)

    IPC进程间通信

    • 进程间的数据是相互隔离, 可以通过队列实现进程间通信

    生产者与消费者模型

    • 通过容器解决生产者和消费者之间的强耦合问题
    • 生产者: 产生数据的
    • 消费者: 使用数据多的

    线程

    • 进程是一个资源单位, 进程是一个执行单位, 是CPU运行调度的最小单位
    • 进程被创建时就带有一个线程
    • 一个进程内可以创建多个线程, 这些线程共享进程的资源
    • 线程的开销要远小于进程

    GIL

    • GIL本质上就是一个互斥锁
    • GIL使得同一时刻一个进程中只有一个线程运行(多线程不能并行, 但可以并发执行)
    • CPython解释器的内存管理不是线程安全的

    多线程与多进程的选择

    • I/O密集型: 多线程
    • 计算密集型: 多进程

    死锁

    • 多线程下因资源竞争而才造成的相互等待现象

    递归锁

    • 递归锁的特点是在一个线程内可以被多次acquire

    • 递归锁的内部维护了一个Lock和一个counter, 每acquire一次计数加一,release一次计数减一, 当计数为0, 既所有acquire都release之后才会释放给其他线程使用

    信号量

    • 信号量相当于多把互斥锁, 可以控制访问资源的进程数量
    • sm = semaphore(5) 表示一次允许五个线程访问数据

    线程队列

    • FIFO队列
    • LIFO队列
    • 优先级队列

    event事件

    • 可以控制其他线程的执行

    进程池与线程池

    • 可以控制程序允许创建的进程和线程数量, 防止超出硬件承受范围

    协程

    • 在单线程中实现并发
    • 线程是系统级别的,由操作系统控制, 协程是程序级别的, 由程序员手动控制
    • 没有上下文切换的开销 , 节省了时间和空间
    • 不能利用多核优势, 进行阻塞操作会阻塞整个程序

    gevent

    • 实现协程

    IO模型

    • 阻塞IO
    • 非阻塞IO
    • 多路复用IO
    • 异步IO
  • 相关阅读:
    【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具
    【Hadoop】HDFS源码解读
    【Hadoop】Hadoop RPC框架线程模型
    电商网站项目(一)用户模块---门户
    jdk1.5后枚举类的定义规则
    回顾static与final的作用
    @Springboot搭建项目controller层接收json格式的对象失败
    把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取
    springboot用mybatis-generator自动生成mapper和model
    hibernate、mybatis、spring data 的对比
  • 原文地址:https://www.cnblogs.com/bigb/p/11739784.html
Copyright © 2020-2023  润新知