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

目录

  • 网络编程

    • 开发架构
    • OSI七层模型
    • socket
    • subprocess
    • 粘包问题
    • socketserver
    • TCP
    • UDP
  • 并发编程
    • 多道技术
    • 并发和并行
    • 进程
    • 僵尸进程和孤儿进程
    • 守护进程
    • 互斥锁
    • 队列
    • IPC进程间通信
    • 生产者与消费者模型
    • 线程
    • GIL
    • 多线程与多进程的选择
    • 死锁
    • 递归锁
    • 信号量
    • 线程队列
    • event事件
    • 进程池与线程池
    • 协程
    • gevent
    • IO模型

网络编程

开发架构

  • 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

原文地址:https://www.cnblogs.com/bigb/p/11739784.html

时间: 2024-10-10 21:14:06

Python3 网络编程和并发编程总结的相关文章

【Java并发编程】并发编程大合集

转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Java并发编程]Volatile关键字(上)

网络编程与并发编程总结

目录 软件开发架构: C/S架构: B/S架构: 一.网络编程: 1.互联网协议OSI七层协议 2.socket 3.手撸socket套接字模板 4.subprocess(了解) 5.粘包问题 6.struct解决粘包问题 7.上传大文件数据 8.socketserver(现阶段,了解) 二.并发编程 1.并发与并行: 2.进程调度: 3.进程的三个状态: 4.同步与异步: 5.阻塞与非阻塞 7.回收进程的两种条件: 9.互斥锁: 10.队列 11.线程 12.全局解释器锁 14.递归锁 15.

python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点

并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别.互斥锁.信号. 事件.join.GIL.进程间通信.管道.队列. 生产者消息者模型.异步模型.IO多路复用模型.select\poll\epoll 高性 能IO模型源码实例解析.高并发FTP server开发 1.请写一个包含10个线程的程序,主线程必须等待每一个子线程执行完成之后才结束执行,每一个子线程执行的时候都需要打印当前线程名.当前活跃线程数量: 1

【Java并发编程】并发编程大合集-值得收藏

http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Ja

多线程编程-之并发编程:阻塞队列

在前面几篇文章中,我们讨论了同步容器(Hashtable.Vector),也讨论了并发容器(ConcurrentHashMap.CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便.今天我们来讨论另外一类容器:阻塞队列. 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(LinkedList是双向链表,它实现了Dequeue接口). 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者

【并发编程】并发编程中你需要知道的基础概念

本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 多线程是Java编程中一块非常重要的内容,其中涉及到很多概念.这些概念我们平时经常挂在嘴上,但是真的要让你介绍下这些概念,你可能还真的讲不清楚.这篇博客就总结下多线程编程中经常用到的概念,理解这些概念能帮助我们更好地掌握多线程编程. 进程(Process)与线程(Thread) 进程和线程是最常提到的概念了.在linux中,线程与进程最大的区别就是是否共

python 网络编程和并发编程题

1.答: 应用层与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的.例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层.但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层.示例:TELNET,HTTP,FTP,NFS,SMTP等.表示层这一层的主要功能是定义数据格式及加密.例如,FTP允许你选择以二进制或ASCII格式传输.如果选择二进制,那么发送方和接收方不改变文件的内容.如果选择ASCII格式,发送方将

网络编程基础---并发编程--多进程

1  multiprocessing模块 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. Python提供了multiprocessing multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,提供了Pr

网络编程和并发编程

进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu 举例(单核+多道) egon在一个时间段内有很多任务要做:python备课的任务,写书的任务,交女朋友的任务,王者荣耀上分的任务 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程 并发与并行 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务 并发:是伪并行,即看起来是同时运行.单个cpu