网络编程
计算机要能投入使用要包含三大块:
应用软件
系统软件
硬件
网络
互联网协议实现了联通全世界的通信
五层协议:
- 物理层:传输一堆二进制电信号
- 数据链路层:分组标准(以太网协议Ethernet),规定了一组电信号称之为一个数据包,一个数据包分为两部分:报头(18个字节)和数据
- 网络层:IP地址
网络编程
socket(套接字)抽象层:封装好的提供给开发者的网络接口
family(socket家族)
socket.AF_UNIX:用于本机进程间通讯
socket.AF_INET:网络编程使用的
socket type类型:
socket.SOCK_STREAM #for tcp
socket.SOCK_DGRAM #for udp
socket.SOCK_RAW #原始套接字
简单的通信
模拟ssh远程命令
涉及:os模块,subprocess模块
1.os.system(命令)
执行命令,返回成功与否的标志
2. subprocess.Popen(‘dir’, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
管道原理,如果命令正确stdout取走结果,如果命令错误则stderr取走结果
sys.argv
一个从程序外部获取参数,sys.argv其可以看作是一个列表,第一个元素是程序本身,随后才依次是外部给予的参数。
粘包
粘包问题只存在于TCP中,Not UDP
服务端接收客户端发来的东西,它又太长超过了recv(数值)的值时,服务端再去执行接收,会发现收到的不是该有的结果而是上一条的部分结果(IO缓冲区),这就叫做粘包,就是指两次结果粘到一起了
并发编程
可在不同进程间来回切换提高CPU运行效率,给用户有一种同时进行的感觉
多道技术
解决了多个程序共享同一个资源的有序调度问题,解决方式:多路复用(时间上和空间上的复用)
并发与并行的区别
并发其实是伪并行,单个CPU+多道技术实现并发
并行必须具备多个cpu才能实现并行
进程
一个程序运行几次就是几个进程。进程就是程序进行的一个过程或者任务,由CPU负责执行(也可以把进程当作一个资源集合,可以细分成一个个线程,线程才是CPU上的执行单位)
开启子进程
from multiprocessing import Process
*multiprocessing模块用来开启子进程(和多线程模块threading的编程接口类似)
*multiprocessing模块提供了Process、Queue、Pipe、Lock等组件
p = Process(target=, …)
p.star()
查看进程pid,ppid
import os
os.getpid()
os.getppid()
僵尸进程
孤儿进程
Process的其他方法
.join() 子进程执行完毕以后才继续运行,否则原地阻塞
.terminate()
.is_alive()
守护进程
.daemon = True
其一:守护进程会在主进程代码执行结束后就终止
其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children
互斥锁
把并行程序里的线程内某一段代码变成串行,牺牲了运行效率,但保证了数据安全
lock=Lock()
lock.acquire()
…
…(确保代码不会错乱)
lcok.release()
Queue(底层就是以管道和锁定的方式实现)
Queue是多进程安全的队列
q = Queue(maxsize队列允许的最大个数)
q.put() #插入数据到队列
q.get() #从队列读取并且删除一个元素
q.full() #到达maxsize个返回True
当队列put满了阻塞,get空了阻塞
但需要明确:
1、队列内存放的是消息而非大数据
2、队列占用的是内存空间,因而maxsize即便是无大小限制也受限于内存大小
生产者消费者模型
1、程序中有两类角色:
一类负责生产数据(生产者)
一类负责处理数据(消费者)
2、引入生产者消费者模型为了解决的问题是
平衡生产者与消费者之间的速度差
程序解开耦合
3、如何实现生产者消费者模型
生产者<—>队列<—>消费者