操作系统

操作系统历史

  • 作用
    • 隐藏复杂硬件接口,并提供良好的抽象接口。
    • 管理、调度进程,并且将多个进程对硬件的竞争变得有序。
  • 异步: 两个函数同时进程
  • 多进程
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.Lock #只有一把锁

信号量

  • 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

posted @ 2020-02-15 11:34  salary_01  阅读(95)  评论(0)    收藏  举报