互斥锁 *******

from multiprocessing import Process,Lock

# 进程间 内存空间是相互独立的
def task1(lock):
    lock.acquire()
    for i in range(10000):
        print("===")
    lock.release()

def task2(lock):
    lock.acquire()
    for i in range(10000):
        print("===============")
    lock.release()

def task3(lock):
    lock.acquire()
    for i in range(10000):
        print("======================================")
    lock.release()

if __name__ == '__main__':
    # 买了一把锁
    mutex = Lock()

    # for i in range(10):
    #     p = Process(target=)
    p1 = Process(target=task1,args=(mutex,))
    p2 = Process(target=task2,args=(mutex,))
    p3 = Process(target=task3,args=(mutex,))

    # p1.start()
    # p1.join()
    # p2.start()
    # p2.join()
    # p3.start()
    # p3.join()

    p1.start()
    p2.start()
    p3.start()

    print("over!")

结果:

  由于数量庞大就不全部写出来了大概就是  : 先 打印 "==="  再打印 "==============="   最后打印"======================================"

 

 

# 什么时候用锁?
    # 当多个进程 同时读写同一份数据 数据很可能就被搞坏了
    # 第一个进程写了一个中文字符的一个字节 cpu被切到另一个进程
    # 另一个进程也写了一个中文字符的一个字节
    # 最后文件解码失败
    # 问题之所以出现 是因为并发 无法控住顺序
    # 目前可以使用join来将所有进程并发改为串行

    # 与join的区别?
    # 多个进程并发的访问了同一个资源  将导致资源竞争(同时读取不会产生问题 同时修改才会出问题)
    # 第一个方案 加上join  但是这样就导致了 不公平  相当于 上厕所得按照颜值来
    # 第二个方案 加锁  谁先抢到资源谁先处理[
    # 相同点: 都变成了串行
    # 不同点:
    # 1.join顺序固定 锁顺序不固定!
    # 2.join使整个进程的任务全部串行  而锁可以指定哪些代码要串行

    # 锁使是什么?
    # 锁本质上就是一个bool类型的标识符  大家(多个进程) 在执行任务之前先判断标识符
    # 互斥锁 两个进程相互排斥

    # 注意 要想锁住资源必须保证 大家拿到锁是同一把

    # 怎么使用?
    # 在需要加锁的地方 lock.acquire() 表示锁定
    # 在代码执行完后 一定要lock.release() 表示释放锁
    # lock.acquire()
    # 放需要竞争资源的代码 (同时写入数据)
    # lock.release()

 

posted @ 2018-11-08 21:44  萤huo虫  阅读(134)  评论(0编辑  收藏  举报