kill -sig pid:通过pid发送信号杀死指定进程
SIGCHLD 子进程改变状态时父进程会收到此信号
OSI七层模型 -----> 网络通信的标准化流程 应用层: 提供用户服务,具体的内容由特定的程序规定
应用层:TFTP(文件传输)、HTTP(超文本传输协议)、DNS(域名解析)、SMTP(邮件传输)
本地使用:127.0.0.1 或 “localhost”
网络地址:“0.0.0.0” 或 “172.168.40.53”
IPv4: 点分十进制 例如:192.168.1.3 取值0~255(32位)
ifconfig:查看本机IP (ens33:本地IP lo:本地回还)
socket.gethostname() : 获取本机主机名
socket.gethostbyname('tedu') : 利用主机名获取ip
socket.gethostbyname('localhost'): 获取本地ip
socket.gethostbyaddr('127.0.0.1') 访问主机IP地址
socket.inet_aton('192.168.1.2') IP十六进制转换
socket.inet_ntoa(b'\xc0\xa8\x01\02') IP十进制转换
socket.getservbyname('ssh') 获取应用程序的端口
sockfd.socket(sock_family = AF_INET,
connfd,addr = sockfd.accept() 等待接受客户端链接
data = connfd.recv(buffersize) 接收消息
sockfd.socket(sock_family = AF_INET,
sockfd.connect(addr) 链接服务端
data = connfd.recv(buffersize) 接收消息
sockfd.socket(sock_family = AF_INET,
data = sockfd.recvfrom(buffersize) 接收消息
sockfd.sendto(data, addr) 发送消息
sockfd.socket(sock_family = AF_INET,
data = sockfd.recvfrom(buffersize) 接收消息
sockfd.sendto(data, addr) 发送消息
sockfd = socket(AF_UNIX, SOCK_STREAM) 创建本地套接字对象
sockfd.bind(file) 绑定套接字文件
connfd,addr = sockfd.accept() 等待链接
connfd.recv(buffersize) 接收消息
sockfd = socket(AF_UNIX, SOCK_STREAM) 创建本地套接字对象
sockfd.connect(sock_file) 链接服务端
connfd.recv(buffersize) 接收消息
sockfd.fileno() 获取套接字的文件描述符
sockfd.getsockname() 获取套结字绑定的地址
sockfd.getpeername() 获取链接套接字客户端的地址
sockfd.setsockopt(level,optname, value) 设置端口可立即重用
sockfd.setblocking(False) 将套接字设置为非阻塞状态
sockfd.settimeout(sec) 设置套接字的超时时间
select模块: IO多路复用,阻塞等待监控的IO事件发生
rs, ws, xs = select(rlist, 等待处理的IO
p.register(s, POLLIN | PLLERR) 注册关注的IO
events = p.poll() 监控关注的IO事件
multiprocessing模块: 创建进程对象
p.join([timeout]) 阻塞等待子进程退出
p.daemon 设置为True主进程结束杀死所有子进程(必须start()前设置)
p.is_alive() 判断进程是处于alive状态(存活)
pool =
pool(x) 创建进程池对象(进程池大小)
pool.apply_async(fun, 要执行的函数(异步执行)
pool.apply(fun, args, kwds) (同步执行)
r = pool.map(fun,range(6)) 将要执行的事件放入进程池
fd1,fd2 =
Pipe(duplex=True) 创建管道(Flase:fd1只读,fd2只写)
fd.send(data) 向管道写入内容满则阻塞
q =
Queue(maxsize=0) 创建队列对象(存放多少条消息)
q.put(data, 存入消息(支持Python数据类型)
timeout]) block为True是表示超时检测
data = q.get([block,timeout]) 取出消息
shm =
Value(ctype, 创建共享内存共享空间
obj) ctype字符串:(C语言数据类型),obj初始数据
shm =
Array(ctype,obj) 创建共享内存共享空间
sem =
Semaphore(num) 创建信号量
sem.acquire() 将信号量减1 0时阻塞
sem.get_value() 获取当前信号量的值(数量)
e.wait([timeout]) 阻塞进程 直到事件对象被set
threshold.
Thread(target, 线程函数
t.daemon = True 主线程退出分支线程也退出
t.setDaemon(True) 主线程退出分支线程也退出
threading.currentThread() 获取当前进程对象
e = threading.
Event() 创建Event事件对象
lock = threading.
Lock() 创建锁对象
StreamRequestHandler 处理tcp请求
DatagramRequestHandler 处理udp请求
ForkingTCPServer ForkingMixIn + TCPServer
ForkingUDPServer ForkingMixIn + UDPServer
ThreadingTCPServer ThreadingMixIn + TCPServer
ThreadingUDPServer ThreadingMixIn + UDPServer
signal.alarm(sec) 设置时钟信号给自己SIGALRM信号
signal.pause() 阻塞进程,等待一个信号
signal.signal(sig, 要处理的信号
handler) 处理方法(SIG_DFL:默认 SIG_IGN:忽略 func:自定义函数)
sys.exit([status]) 退出一个进程(状态:退出提示字符串)
os.path.exists(file) 判断一个文件是否存在
pid = os.fork() 创建进程 失败-1 成功0
os.exit(status) 退出一个进程(状态:整数 默认0)
pid,status = os.wait() 塞等待处理子进程的退出
os.WEXITSTATUS(status) 获取原来退出状态
pid,status = os.waitpid(pid,option) 阻塞等待处理子进程的退出
os.path.getsize('./1.txt') 读取文件的大小
os.kill(pid,sig) 发送一个信号给某个进程
os.listdir(path) 获取指定目录文件列表
os.path.isfile() 判断一个 文件是否为普通文件
os.path.isdir() 判断一个文件是否为目录
3.被动方再次发送报文,表示准备处理就绪,可以断开
如果建立的另一端链接被断开, 则recv立即返回空字符串
recv是从接受缓冲区取出内容,当缓冲区为空则阻塞
recv如果一次接受不完缓冲区的内容,下次执行会自动接受
4.http1.1 ---> http2.0(还没发布) 技术的成熟和稳定性
GET /index.html /HTTP/1.1
同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件
此时形成多个IO时间都可以操作的现象,不必逐个等待执行
p.register(s, POLLIN | PLLERR)
POLLIN POLLOUT POLLERR POLLHUP POLLPRI
rlist wlist xlist 断开 紧急处理
events是一个列表[(fileno, evnet), (), ()....]
11 << 2 == 44 右侧补零(乘2乘2次)
14 >> 2 == 3 挤掉右侧的数字(地板除2除2次)
通过程序利用计算机的多个核心达到同时执行多个任务的目的
如果有个进程占有CPU此时我们称为该进程占有CPU的时间片
进程创建后 会自动在内存中产生一个空间存放进程信息
在操作系统中每个进程都有唯一的PID值是由系统分配的
每个进程拥有自己独立的运行空间(4个G的虚拟内存空间)
进程具备执行条件,等待系统分配处理器资源进入运行态
nice -9 ./hello.py 以9的优先级运行
sudo nice --9 ./hello.py 以-9优先级运行
首行添加 #! /usr/bin/python3 指定执行器
当父进程先于子进程退出,此时子进程就会成为孤儿进程。
* 孤儿进程会被系统指定进程收养,即系统进程会成为孤儿
进程新的父进程。系统进程会自动处理孤儿进程退出状态
子进程先于父进程退出,父进程没有处理子进程的退出状态,此时子进程就会成为僵尸进程
* 僵尸进程会滞留部分PCB信息在内存中,大量的僵尸进
程会消耗系统的内存资源,所以要尽量避免僵尸进程产生
如果有大量的任务需要多进程完成,而调用周期比较短且需要频繁创建
此时可能产生大量进程频繁创建销毁的情况 消耗计算机资源较大
线程也是一种多任务编程方式,可以使用计算机的多核资源
5.线程也有自己的特征属性,TID、指令集、线程栈
6.多个线程之间独立运行互不干扰 空间不独立(都消耗进程空间)
7.线程的创建删除消耗的资源要小于进程 线程/进程(1/20)
多个线程共用线程空间,所以进程的全局变量对进程内线程均可见
1.两者都是多任务编程的方式 都能够使用计算机的多核
3.进程空间独立,数据安全性好,有专门的进程间的通信方法
4.线程使用全局变量,更加简单,但需要同步互斥操作
5.一个进程可以包含多个线程,线程共享进程空间资源
1.一个进程中并发任务比较多,比较简单,适合使用多线程
2.如果数据程序比较复杂,特别是可能多个任务通信比较多的时候
3.多个任务存在明显差异,和功能分离的时候没有必要一定写入到一个进程中
Python --->支持线程操作--->出现IO同步互斥--->加锁--->超级锁,给解释器加锁
此时其他线程需要等待。大大降低了Python线程的执行效率
3.Python线程尽量用在高延迟多阻塞的IO情形
3.不使用CPython 使用C#、JAVA 做的得解释器
单进程程序,循环接受客户请求,处理请求,处理完毕后再接受下一次请求
每次只能处理一个客户端请求,如果客户端长期占有服务器则无法处理其他客户端
为每个客户端单独提供一个进程或线程,处理客户端请求