目录:
- 操作系统发展
- 进程理论
- 创建进程的两种方式
- join方法
- 进程之间数据互相隔离
- 进程对象其他的属性和方法
- 守护进程
- 僵尸进程与孤儿进程简单介绍
- 互斥锁
- 进程间通信(IPC机制)
- 生产者消费者模型
- 全局解释器锁GIL
- 进程池
操作系统发展
多道技术
1.空间上的复用
多个程序公用一套计算机硬件
2.时间上的复用
cpu会在多个程序之间来回切换
1.程序遇到IO主动切
2.程序长时间(时间片)占用CPU切
切换 + 保存状态
进程理论
进程与程序的区别:
程序:一堆死代码
进程:正在运行的程序
进程是资源单位,进程与进程之间数据是绝对意义上的物理隔离,但是可以利用某些技术实现数据交互(消息队列)
进程之间调度算法优化历程
- 时间片轮转法+多级反馈队列
进程的并行与并发及同步异步阻塞非阻塞:
并行:同时运行
并发:看起来像同时运行
同步与异步:描述的是任务的提交方式
同步:提交任务之后原地等待任务的返回结果
异步:提交任务之后 继续执行的后续代码 不等待结果 (回调机制)
阻塞与非阻塞:描述的是程序的运行状态
阻塞:程序阻塞态
非阻塞:就绪态或者运行态
进程三状态图解
回到目录
创建进程的两种方式
# 第一种自己定义函数
from multiprocessing import Process
import time
def task(name):
print('%s is dsb'%name)
time.sleep(1)
print('%s is over'%name)
# windows操作系统下,创建进程一定要在main内创建,因为windows下创建进程类似于导模块的形式
# 会将开启它的进程的代码从头到位按照导模块的方式执行一遍,将产生的名字丢到新创建的进程内存中
if __name__ == '__main__':
p = Process(target=task,args=('egon',)) # 实例化进程对象,注意传参
# p = Process(target=task,kwargs={'name':'egon'})
p.start() # 告诉操作系统开启一个新的进程
print('主')
# 第二种利用类的继承
# 类的继承
class MyProcess(Process):
def run(self):
print('hello big baby!')
time.sleep(1)
print('get out!')
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主')
join方法
"""
1.介绍join方法、
2.多个进程多次join
3.for循环中join验证join特性
4.给函数加一个睡眠时间参数,主进程统计结束时间,join子进程先后顺序调换(最长的子进程时间多一点点)
5.将重复操作变成for循环的形式
"""
from multiprocessing import Process
import time
def task(name, n):
print('%s is dsb' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
start_time = time.time()
p_list = []
for i in range(1, 4):
p = Process(target=task, args=('子进程%s' % i, i))
p.start()
p_list.append(p)
for p in p_list:
p.join()
print('主', time.time() - start_time)
"""join是让主进程等待子进程运行完毕,再结束。不影响子进程的运行"""
进程之间数据互相隔离
from multiprocessing import Process
x = 100
def task():
global x
x = 222
if __name__ == '__main__':
p = Process(target=task)
p.start()
p.join