昨日内容回顾
-
粘包问题及解决思路
粘包问题:TCP协议下将人认知中应该分来的数据打包发送,导致所谓粘包问题。
解决思路:
明确应接收数据的长度(至少首次收到的数据长度应明确),其余数据长度根据首次数据解析出→
使用struct模块对原数据长度进行加工,得到固定长度数据发送→
接收数据方对数据进行解析,得到原数据长度,然后接收原数据。
-
操作系统的发展
穿孔纸片——联机批处理——脱机批处理。本质是CPU利用率提升的过程。
-
进程理论基础
单道:一次只运行一个程序,运行结束前不做其他操作。
多道:在多个程序之间切换,每次切换保存运行状态。
并行:多个CPU同时运行。
并发:单个CPU同时运行多个进程。
CPU分配算法:时间片轮转+多级反馈队列。
进程三状态:就绪态、阻塞态、运行态。
今日内容概要
- 进程相关术语
- 创建进程的方式
- 进程的同步方法
- 进程间数据交互
- 进程对象的内置方法
- 特殊情况下的进程
今日内容详细
进程相关术语
同步:程序运行与时间经过同步,分支步骤完成后再向下运行。
异步:程序运行与时间不完全同步,不等分支步骤完成直接向下运行。
异步可以提高CPU的利用率,因此,在非必要的情况下一般使用异步设计。
创建新进程的方式
一种是使用multiprocessing模块。
from multiprocessing import Process # 导入模块
def func(parm): # 定义子进程内容
print(parm)
if __name__ == '__main__':
p1 = Process(target=func, ags=(parm1,)) # 创建新的子进程,指定目标函数、传参
p1.start() # 执行子进程
另一种是使用类生成新的进程对象。
from multiprocessing import Process
import time
class MyProcess(Process): # 继承原Process类生成新类
def __init__(self, parm):
super().__init__()
self.parm = parm
def run(self): # 指定新进程需要执行的内容
print('run is running', self.parm)
time.sleep(3)
print('run is over', self.parm)
if __name__ == '__main__':
obj = MyProcess('parm') # 生成新进程对象
obj.start() # 执行新进程
进程的同步方法
使用进程对象的内置函数join(),在子进程执行后下一行调用join方法,程序会等待子进程运行结束再向下运行。
进程间的数据交互(IPC)
使用消息队列实现进程间的数据交互,多个进程可使用同一个消息队列内的数据。
from multiprocessing import Queue
q = Queue(int) # 生成新的队列对象,需要指定队列容量
q.put(obj) # 依次放入数据值
q.get(obj) # 依次取出数据值
q.full() # 判断队列是否已满
q.empty() # 判断队列是否已空
进程对象的内置方法
1.如何查看进程号
from multiprocessing import Process, current_process
current_process()
current_process().pid
import os
os.getpid()
os.getppid()
2.终止进程
p1.terminate()
ps:计算机操作系统都有对应的命令可以直接杀死进程
3.判断进程是否存活
p1.is_alive()
特殊情况下的进程
子进程与主进程绑定存活(守护进程)
在子进程开始运行之前指定子进程的daemon为True,则子进程就会成为主进程的守护进程,主进程结束意味着守护对象的消失,子进程则无存活必要,与主进程一起消亡。
僵尸进程
任何进程都有成为僵尸进程的时期,僵尸进程的时期为进程结束后的一小段时间,此时进程已结束,但进程相关的数据尚未完全删除,等待系统回收其对应内存。
孤儿进程
指主进程结束后还未结束的子进程,此时系统会指定某个进程作为其父进程,直至子进程结束运行。
标签:__,Process,parm,基础知识,import,进程,相关,数据 From: https://www.cnblogs.com/akazukis/p/16904966.html