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备课的任务,写 ...
随机推荐
- thinkphp在模板中使用php的函数
thinkphp在模板中使用php的函数 使用 {:函数名} 的形式 例如: // 获取 session 中存的值 {:session('admin.loginname')} // 输出当前日期 {: ...
- H5之外部浏览器唤起微信分享
最近在做一个手机站,要求点击分享可以直接打开微信分享出去.而不是jiathis,share分享这种的点击出来二维码.在网上看了很多,都说APP能唤起微信,手机网页实现不了.也找了很多都不能直接唤起微信 ...
- 标准库bufio个人详解
本文是我有通俗的语言写的如果有误请指出. 先看bufio官方文档 https://studygolang.com/pkgdoc文档地址 主要分三部分Reader.Writer.Scanner 分别是读 ...
- [ch02-03] 梯度下降
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 2.3 梯度下降 2.3.1 从自然现象中理解梯度下降 ...
- Linux -- 进程间通信几种方式的总结
管道 优点 管道文件不占磁盘空间,打开管道时在内存中分配空间: 管道读端会在读取完管道内数据后自动进入阻塞,直到写端再次写入数据: 缺点 管道是半双工的,数据只能从一个方向上流动: 管道大小 PIPE ...
- Docker 遇到的一些错误
1.version Base not defined in file libdevmapper.so.1.02 在 Centos 6.5 上安装docker-io之后,使用/etc/init.d/do ...
- 阿里P7整理“硬核”面试文档:Java基础+数据库+算法+框架技术等
现在的程序员越来越多,大部分的程序员都想着自己能够进入大厂工作,但每个人的能力都是有差距的,所以并不是人人都能跨进BATJ.即使如此,但身在职场的我们一刻也不能懈怠,既然对BATJ好奇,那么就要朝这个 ...
- Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the server requires more time
启动Tomcat服务器时经常遇到这个错误, Server MyEclipse Tomcat v7.0 was unable to start within 45 seconds. If the ser ...
- ios注册通知NSNotificationCenter(一)
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] ...
- 网站出现bug,我深夜被叫醒处理,用一个触发器解决了问题
凌晨两点,我正在睡梦之中,此时电话忽然想起,在漆黑的深夜中显得格外刺耳. 这个时间点电话响了肯定没好事,因为我的手机在夜间模式下,除非被同一个电话号码打三次,否则是静音,因此电话那边的人肯定有急事找我 ...