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
- 面向数据的不可靠数据传输协议
- 不需要建立双向通道
- 传输速度快
- 不会有粘包问题
- 发送数据不需要得到对方返回消息
并发编程
多道技术
- 单道: 内存中只存在一个任务
- 多道: 内存中存在多个任务(分时交替运行, 切换+保存状态)
并发和并行
- 并发: 一段时间内执行多个任务, 这些任务分时交替运行
- 并行: 一个时间点上可以运行多个任务
进程
- 程序: 数据和指令的集合, 静态的概念
- 进程: 程序关于某个数据集合的一次运行, 动态的概念
- 进程时操作系统进行资源分配的基本单位
进程调度:
- 先来先服务: 谁先就绪就先执行谁
- 短作业优先: 谁的预计执行时间短就执行谁
- 时间片轮转法: 为每个进程分配一个时间段, 在这个时间段内执行该进程
- 分级反馈队列: 设置多个就绪队列, 设置不同的优先级
进程的三种状态:
- 就绪态
- 执行态
- 阻塞态
- 同步和异步: 面向被调用者的消息提醒机制
- 同步: 等有结果再返回
- 异步: 先返回, 再执行, 有结果再通知
- 阻塞和非阻塞: 面向调用者的等待消息的状态
- 阻塞: 死等
- 非阻塞: 等待的同时可以干其他事情
- 创建进程的两种方式:
p=Process(target=函数名, args=(参数, ))
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
Python3 网络编程和并发编程总结的更多相关文章
- python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别 ...
- 【Java并发编程】并发编程大合集-值得收藏
http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...
- .net 系列:并发编程之一 并发编程的初步理论
一.关于并发编程的几个误解 1)并发就是多线程 实际上多线程只是并发编程的一种形式而已,在C#中还有很多其他的并发编程技术,包括异步编程,并行编程,TPL数据流,响应式编程等. 2)只有大型服务器才 ...
- 【Java并发编程】并发编程大合集
转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅 ...
- C#并发编程-1 并发编程概述
一 并发编程简介 1.1 关于并发和并行 并发和并行的概念: 并发:(Concurrent),在某个时间段内,如果有多个任务执行,即有多个线程在操作时,如果系统只有一个CPU,则不能真正同时进行一个以 ...
- python3全栈开发-并发编程,多进程的基本操作
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- Python网络编程与并发编程
网络编程基础 黏包 , 并发 计算机网络的发展及基础网络概念 Python 中的进程与 锁 Python IO 多路复用 \协程
- Python之网络编程之并发编程的IO模型,
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
- python3全栈开发-并发编程的多进程理论
一. 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): duoduo在一个时间段内有很多任务要做:python备课的任务,写 ...
随机推荐
- C++中对C的扩展学习新增语法——For循环以及AUTO类型
For循环以及AUTO类型 For代码实现: AUTO类型: 1.auto自动类型推导,省事. 2.auto主要在模板中用的多,模板的类型比较长,使用auto可以简化代码. 3.不要轻易使用,我们在编 ...
- 这份最新Python面试精选问题你会几道?
相信很多小伙伴学python以后都想进大厂,但是进大厂前你得了解些大厂面试题,可以在面试前复习下,以下是精选的5道python面试题: 第一. Python 的特点和优点是什么? Python 可以作 ...
- hdu 2516 取石子游戏 (Fibonacci博弈)
取石子游戏 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- nyoj 73-比大小 (Java, 高精度)
73-比大小 内存限制:64MB 时间限制:3000ms 特判: No 通过数:15 提交数:64 难度:3 题目描述: 给你两个很大的数,你能不能判断出他们两个数的大小呢? 比如1234567891 ...
- set map symbol
set 声明 let set = new Set();即创建了一个空的set 赋值 let set = new Set(['张三','李四','王五']); 特性 似于数组,但它的一大特性就是所有元素 ...
- C语言1博客作业01
1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 主修大数据技术导论.数据采集与处理实践(Python).Web前/后端开发.统计与数据分析.机器学习.高级数据库系统.数据可视化.云计算技术. ...
- 移动端vue页面禁止移动/滚动
当需要在移动端中禁止页面滚动,加入:@touchmove.prevent即可,例子如下 <template> <div @touchmove.prevent> <h3 c ...
- 无法优化的O(n!) 算法
旅行商问题: 有一位旅行商,他需要前往5个城市. 要前往这5个城市,同时要确保旅程最短. 对于每种顺序,他都计算总旅程,再挑选出旅程最短的路线.5个城市有120种不同的排列方式.因此,在涉及5个城市时 ...
- SCAU1143 多少个Fibonacci数--大菲波数【杭电-HDOJ-1715】--高精度加法--Fibonacci数---大数比较
/*******对读者说(哈哈如果有人看的话23333)哈哈大杰是华农的19级软件工程新手,才疏学浅但是秉着校科联的那句“主动才会有故事”还是大胆的做了一下建一个卑微博客的尝试,想法自己之后学到东西都 ...
- Python 深入浅出支持向量机(SVM)算法
相比于逻辑回归,在很多情况下,SVM算法能够对数据计算从而产生更好的精度.而传统的SVM只能适用于二分类操作,不过却可以通过核技巧(核函数),使得SVM可以应用于多分类的任务中. 本篇文章只是介绍SV ...