美文网首页
多进程- 锁、信号量、事件

多进程- 锁、信号量、事件

作者: 冬至是条狗 | 来源:发表于2018-12-08 20:23 被阅读0次

    multiprocessing

    • 创建进程的两种方式

        import multiprocessing
        import time 
        
        
        def func():
            while True:
                print("in func")
                time.sleep(1)
        
        
        p = multiprocessing.Process(target=func) # 后面可以跟args=(,)参数元祖
        p.start()
      
    • 无参数的类创建

        import multiprocessing
        import time
        
        
        class Myprocessing(multiprocessing.Process):
        
        def run(self):
        time.sleep(1)
        print("in Myprocessing")
        
        
        p = Myprocessing()
        p.start()
      
    • 有参数的类创建

        import multiprocessing
        import time
        
        
        class Myprocessing(multiprocessing.Process):
        
        def __init__(self, args1, args2):
            super().__init__()
            self.args1 = args1
            self.args2 = args2
            
        def run(self):
            time.sleep(1)
            print("in Myprocessing")
            print(self.args1)
            print(self.args2)
            print(self.pid)
        
        
        p = Myprocessing(1, 2)
        p.start()
      
    • p.daemon = True # 用来开启守护进程,开启后,主进程执行完毕该子进程结束。

    • p.is_alive() # 判断子进程是否活着

    • p.terminate() # 用来结束一个子进程,结束后需要等待操作系统调度执行。并不会立即结束

    进程锁

    使用进程锁可以保证同一个数据只能被一个进程访问和修改,但每次使用完要记得释放锁

    为了数据安全,在多进程修改数据库时使用锁,降效保证数据安全,而查看则不需要加锁

    lock = multiprocessing.Lock() # 创建一个锁对象
    lock.acquire()  # 获得锁的使用权
    lock.release()  # 释放锁的使用权
    

    信号量

    可以理解为同一段代码同一时间的使用数量,需要在进程创建时将对象传入,使用时与进程锁类似

    sem = multiprocessing.Semaphore(x)    # x为控制的数量
    

    事件

    一个信号可以使所有的进程都进入阻塞状态,也可以使所有的进程接触阻塞。

    事件被创建后默认为阻塞状态

    e = multiprocessing.Event()
    
    • print(e.is_set()) # 查看当前状态

    • e.set() # 事件状态改为True

    • e.wait() # 如果事件状态为False 程序阻塞

    • e.clear() # 事件状态设置为 False

    事件可以作为进程之间互相控制的开关,例程: 红绿灯

    import multiprocessing
    import time
    import random
    
    # 起一个进程控制红绿灯
    
    class Light(multiprocessing.Process):
        def __init__(self, e):
            super().__init__()
            self.e = e
    
        def run(self):
            while True:
                print("绿灯亮了,可以走")
                e.clear()
                time.sleep(2)
                print("红灯亮了,停")
                e.set()
                time.sleep(2)
    
    
    def car(e):
        while True:
            if e.is_set():
                e.wait()
                print("车辆等待")
            else:
                print("车辆通过")
            time.sleep(random.random())
    
    
    if __name__ == '__main__':
        e = multiprocessing.Event()
        light_p = Light(e)
        light_p.daemon = True
        light_p.start()
        e.set()
        car(e)

    相关文章

      网友评论

          本文标题:多进程- 锁、信号量、事件

          本文链接:https://www.haomeiwen.com/subject/xukchqtx.html