美文网首页
python——互斥锁的使用和分析

python——互斥锁的使用和分析

作者: mutang | 来源:发表于2021-09-28 10:18 被阅读0次
    mutex = threading.Lock()
    定义一个全局的互斥锁对象,默认不加锁
    

    情况一:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    @author: zx coder
    @software: PyCharm
    @file: t5全局变量竞争资源.py
    @time: 2020/9/27 22:23
    """
    
    import threading
    import time
    
    g_num = 0
    
    def test1(num):
        global g_num
        mutex.acquire()
        for i in range(num):
            g_num += num
        mutex.release()
        print("--------in test1  g_num = %d"%g_num)
    
    
    def test2(num):
        global g_num
        mutex.acquire()
        for i in range(num):
            g_num += num
        mutex.release()
        print("--------in test2  g_num = %d" % g_num)
    
    def main():
        t1 = threading.Thread(target=test1, args=(1000000,))
        t2 = threading.Thread(target=test2, args=(1000000,))
    
        t1.start()
        t2.start()
    
        time.sleep(2)
    
        print(f"--- main  ---- g_num = {g_num}")
    
    
    mutex = threading.Lock()
    
    
    if __name__ == '__main__':
        main()
    

    out:

    --------in test1  g_num = 1000000000000
    --------in test2  g_num = 2000000000000
    --- main  ---- g_num = 2000000000000
    

    再看,情况二:

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    """
    @author: zx coder
    @software: PyCharm
    @file: t5全局变量竞争资源.py
    @time: 2020/9/27 22:23
    """
    
    import threading
    import time
    
    g_num = 0
    
    def test1(num):
        global g_num
        for i in range(num):
            mutex.acquire()
            g_num += num
            mutex.release()
        print("--------in test1  g_num = %d"%g_num)
    
    
    def test2(num):
        global g_num
    
        for i in range(num):
            mutex.acquire()
            g_num += num
            mutex.release()
        print("--------in test2  g_num = %d" % g_num)
    
    def main():
        t1 = threading.Thread(target=test1, args=(1000000,))
        t2 = threading.Thread(target=test2, args=(1000000,))
    
        t1.start()
        t2.start()
    
        time.sleep(2)
    
        print(f"--- main  ---- g_num = {g_num}")
    
    
    mutex = threading.Lock()
    
    
    if __name__ == '__main__':
        main()
    

    out:

    --------in test2  g_num = 1894359000000
    --------in test1  g_num = 2000000000000
    --- main  ---- g_num = 2000000000000
    

    总结:

    1. 互斥锁使用原则:加锁的代码越少越好,对比之下,优先考虑用情况二
    2. 在情况二中,test2执行后的结果是随机的,数值大于一百万,小于两百万,为什么?因为,执行加1代码时,两线程共同抢CPU资源,谁抢到谁用。在test2执行一百万次中,test1也抢到很多,故而,全局变量g_num变成了在test2执行完的时间内两个线程共同作用的结果

    相关文章

      网友评论

          本文标题:python——互斥锁的使用和分析

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