操作系统历史
- 作用
- 隐藏复杂硬件接口,并提供良好的抽象接口。
- 管理、调度进程,并且将多个进程对硬件的竞争变得有序。
- 异步: 两个函数同时进程
- 多进程
from multiprocessing import Process
def func():
print(12345)
if __name__ == '__main__':
#启动主进程
p = Process(target=func) # 注册 p 是一个进程对象
p.start()
print('*'*10)
# ****** 12345 同时执行 不一定谁快谁慢
- os.getpid() 查看当前进程,
- os.join()
import time
from multiprocessing import Process
def func(arg1,arg2):
print('*'*arg1)
time.sleep(5)
print('*'*arg2)
p = Process(target=func,args=(10,20))
p.start()
p.join() #异步变成同步了;子进程结束
print('=======:运行完了')
开启多进程的多种方式
from multiprocessing import Process
import os
class MyProcess(Process):
def run(self):
print(os.getpid())
print('主进程',os.getpid())
p1 = MyProcess()
p1.start()
p2 = MyProcess()
p2.start()
进程与进程之间数据隔离
守护进程
def func():
while True:
time.sleep(0.5)
print('我很好') #子进程
def func2():
while True:
print('in func2')
time.sleep(8)
print('in func2 finished')
if __name__ == '__main__':
p = Process(target= func)
p.daemon = True #设置子进程为守护进程
p.start()
Process(target=func2).start()
i = 0
while i<5:
print('socket sever')
time.sleep(5)
i += 1
#守护进程随着主进程 代码执行完成结束 而不是主进程结束;
进程锁
信号量
- multiprocess.Semaphore
- 某一段代码同一时间只能被n个进程执行
from multiprocessing import Process,Semaphore
import time
import random
def ktv(i):
sem.acquire()
print('%s走进ktv'%i)
time.sleep(random.randint(1,5))
print('%s走出ktv'%i)
sem.release()
sem = Semaphore(4)
for i in range(20):
p = Process(target=ktv,args=(i,))
p.start()
事件 通过一个信号来控制多个进程同时执行或者阻塞
from multiprocessing import Event
# 一个信号可以使所有的进程都进入阻塞状态
# 也可以控制所有的进程解除阻塞
# 一个事件被创建之后,默认是阻塞状态
e = Event()
print(e.is_set()) #查看一个事件状态 False
e.set() #设置为True e.clear() 设置为False
e.wait() #等待 e设置为True 往下执行
print(123456)
import random
import time
from multiprocessing import Event,Process
def cars(e,i):
if not e.is_set():
print('car %d 在等待'%i)
e.wait() #
print('car %d 在通行'%i)
def light(e):
while True:
if e.is_set():
print('\033[31m红灯亮\033[0m')
time.sleep(2)
e.clear() # True -->False
else:
print('\033[32m绿灯亮\033[0m')
time.sleep(2)
e.set() #False -->True
if __name__ == "__main__":
e = Event()
traffic = Process(target=light,args=(e,))
traffic.start()
for i in range(20):
car = Process(target=cars,args=(e,i))
car.start()
time.sleep(random.random())
进程之间通信 IPC multiprocess.Queue multiprocess.Pipe