python开发学习笔记之八(网络编程进阶)
---恢复内容开始---
在介绍进程与线程的相关内容之前,先来总结一下操作系统的相关内容:
操作系统
作用:
1.隐藏复杂的硬件接口,提供良好的抽象接口
2.管理、调度进程,使得进程对硬件的竞争变得有序
实现方法:
多道技术:针对单核,实现并发的执行任务。
空间上的多道技术:多个进程共享一个内存空间,但是彼此间内存数据相互隔离
时间上的多道技术:在进程遇到IO阻塞,或者运行时间过长的情况时,CPU会切换到其他进程执行,最终效果是CPU在不同的进程之间来回切换
ps:在切换到其他进程时,需要保存当前进程的状态,并在切回此进程是恢复状态
进程
进程就是程序正在执行的过程,是程序执行过程的抽象。
进程与程序的区别:程序只是一串保存在硬盘上的代码,而进程是程序执行的过程
并发与并行
并发:在单核CPU上运行任务,通过多道技术实现表面上的“同时运行”的效果,在不同的进程之间来回切换,来运行多个任务。同一时间点,CPU只在运行一个任务
并行:只有在多核CPU上才能实现并行,每个CPU的工作方式与单核CPU的工作方式一样,也是并发执行
进程的层次结构
无论UNIX还是windows,进程只有一个父进程,不同的是:
-
在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。
-
在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了
进程的状态
进程有三种状态:
运行、阻塞、就绪
当一个进程运行时间过长时,操作系统会切换至其他就绪的进程执行,而此进程就会变成就绪状态;
当进程需要执行IO操作时,进程就处于阻塞状态,操作系统会切换到其他就绪状态的进程
进程的创建
创建进程需要用到multiprocessing模块
创建进程有两种方式:
# 方式一 import time from multiprocessing import Process def task(name): print('%s is start' % name) time.sleep(2) print('%s is done' % name) if __name__ == "__main__": p1 = Process(target=task, args=(p1,)) p2 = Process(target=task, args=(p2,)) p1.start() p2.start() print('这是主进程打印的内容...') # 方式二 import time from multiprocessing import Process class MyProcess(Process): def __init__(self): super().__init() self.name = name def run(self): print('%s is start' % self.name) time.sleep(2) print('%s is done' % self.name) if __name__ == "__main__": p1 = MyProcess('p1') p2 = MyProcess('p2') p1.start() p2.start() print('这是主线程的内容...')
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程
强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
Process类的参数:
target 表示调用对象,即子进程要执行的任务
args 表示调用对象的位置参数元组,args=(1,2,'egon',)
kwargs 表示调用对象的字典,kwargs={'name':'egon','age':18}
name 为子进程的名称
进程方法:
p.start() 启动进程,并调用类内部的run()方法
p.run() 执行进程指向的方法
p.terminate() 终结进程,不进行清理工作,p下的子进程将成为僵尸进程
p.is_alive() 查看进程是否存活
p.join([timeout]) 主进程等待p进程执行完成
进程属性:
p.name 进程名
p.pid 进程pid
p.daemon 默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.join()
主进程会等待进程p执行完成才会继续执行,多个子进程执行join方法后,主进程会同时等待多个子进程,直到最后一个子进程执行完成,主进程才会继续执行
守护进程
守护进程的设置就是把进程的p.daemon属性在运行之前改为True,守护进程会伴随主进程的生命周期,当主进程终止,守护进程也会跟随主进程终止;
守护进程不可再创建出子进程
互斥锁