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
'''

 

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

posted @ 2019-06-17 18:58  minger_lcm  阅读(1879)  评论(0编辑  收藏  举报