zoukankan      html  css  js  c++  java
  • python 并发编程 多进程 互斥锁

    运行多进程  每个子进程的内存空间是互相隔离的 进程之间数据不能共享的

     

    一 互斥锁

    但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,

    是可以的,而共享带来的是竞争,竞争带来的结果就是错乱

     

    #并发运行,效率高,但竞争同一打印终端,带来了打印错乱
    
    from multiprocessing import Process
    import time
    
    def task(name):
        print("%s 1" % name)
        time.sleep(1)
        print("%s 2" % name)
        time.sleep(1)
        print("%s 3" % name)
    
    
    
    if __name__ == '__main__':
        for i in range(3):
            p = Process(target=task, args=("子进程%s" % i,))
            p.start()
    
    '''
    子进程2 1
    子进程0 1
    子进程1 1
    子进程2 2
    子进程1 2
    子进程0 2
    子进程2 3
    子进程1 3
    子进程0 3
    '''

    如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,

    互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人抢到卫生间后上一把锁,其他人都要等着,等到这个完成任务后释放锁,其他人才有可能有一个抢到......

    所以互斥锁的原理,就是把并发改成串行,降低了效率,但保证了数据安全,不错乱

     

    加了互斥锁就没有并发效果了  加上锁只有一个可以运行  互斥锁会把并发变成串行 效率变低了

     

    解决:

    导入模块 Lock

    现在程序启动 所有进程首先会去抢锁 只有抢到锁的才能运行
    等这个进程运行完了解锁后 再到其他进程继续抢锁
    from multiprocessing import Process, Lock
    import time
    
    def task(name, mutex):
    
        # 加锁
        mutex.acquire()
    
        print("%s 1" % name)
        time.sleep(1)
        print("%s 2" % name)
        time.sleep(1)
        print("%s 3" % name)
    
        # 把锁拆了
        mutex.release()
    
    
    if __name__ == '__main__':
    
        # 建一个对象实例
        mutex = Lock()
        for i in range(3):
            # 把锁传给子进程 让所有子进程用同一把锁
            p = Process(target=task, args=("子进程%s" % i, mutex))
            p.start()
    
    '''
    现在程序启动 所有进程首先会去抢锁 只有抢到锁的才能运行
    等这个进程运行完了解锁后 再到其他进程继续抢锁
    '''
    
    '''
    子进程0 1
    子进程0 2
    子进程0 3
    子进程1 1
    子进程1 2
    子进程1 3
    子进程2 1
    子进程2 2
    子进程2 3
    '''

    牺牲了效率,保证数据不错乱

  • 相关阅读:
    【YbtOJ#911】欧拉函数
    【CF590E】Birthday
    打印控件的区别
    RPA教程
    UiPath培训教程
    RPA视频教程
    搭建samba服务
    kvm虚拟机在线扩容
    zabbix监控交换机
    UiPath Level3讲解
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/8996888.html
Copyright © 2011-2022 走看看