• Python中线程与互斥锁


    了解之前我们先了解一下什么是多任务?

    概念: 几个不同的事件在同时运行就是多任务, 这样的话, 我们有牵扯到了真的多任务, 假的多任务;

    并行: 真的多任务, 通过电脑的核数来确定

    并发: 假的多任务, 即cpu的快速切换

    线程

    1.线程之间共享全局变量;

    2.主线程等待子线程结束后才结束;

    3.线程之间执行顺序是无序的;

    4.互斥锁以及死锁的问题.

    demo 如何创建线程:

    import threading
    from time import sleep,ctime
    
    def sing():
        for i in range(3):
            print("正在唱歌...%d"%i)
            sleep(1)
    
    def dance():
        for i in range(3):
            print("正在跳舞...%d"%i)
            sleep(1)
    
    if __name__ == '__main__':
        print('---开始---:%s'%ctime())
    
        t1 = threading.Thread(target=sing)
        t2 = threading.Thread(target=dance)
    
        t1.start()  // 注意当调用start时才真正的开始执行程序
        t2.start()
    
        #sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?
        print('---结束---:%s'%ctime())

    多线程之间共享全局变量

    demo:

    from threading import Thread
    import time
    
    def work1(nums):
        nums.append(44)
        print("----in work1---",nums)
    
    
    def work2(nums):
        #延时一会,保证t1线程中的事情做完
        time.sleep(1)
        print("----in work2---",nums)
    
    g_nums = [11,22,33]
    
    t1 = Thread(target=work1, args=(g_nums,))
    t1.start()
    
    t2 = Thread(target=work2, args=(g_nums,))
    t2.start()

    运行结果是:

    ----in work1--- [11, 22, 33, 44]

    ----in work2--- [11, 22, 33, 44]


    互斥锁以及死锁的问题:
    思考: 为什么要使用互斥锁?
    线程之间共享资源, 这就导致了多个线程之间资源竞争, 导致了程序的运行.
    思考: 锁的好处以及坏处?
    好处: 保证了同一时间内允许一个线程的完整执行
    坏处: 降低了效率, 可能会造成死锁问题

    demo:

    import threading
    import time
    
    # 定义一个全局变量
    g_num = 0
    def test1(num):
        global g_num
    
        for i in range(num):
    
            mutex.acquire()  # 上锁 注意了此时锁的代码越少越好
            g_num += 1
            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 += 1
            mutex.release()  # 解锁
        print("-----in test2 g_num=%d=----" % g_num)
    
    
    # 创建一个互斥锁,默认是没有上锁的
    mutex = threading.Lock()
    
    
    def main():
        t1 = threading.Thread(target=test1, args=(1000000,))
        t2 = threading.Thread(target=test2, args=(1000000,))
    
        t1.start()
        t2.start()
    
        # 等待上面的2个线程执行完毕....
        time.sleep(2)
    
        print("-----in main Thread g_num = %d---" % g_num)
    
    if __name__ == "__main__":
        main()

    死锁: 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁

    demo:

    import threading
    import time
    
    
    def test1(num):
        print("---test1---")
        mutex1.acquire()
        print("test1 请求 mutex1")
        time.sleep(1)
        print("test1 获得 mutex1")
        print("test1 请求 mutex2")
        mutex2.acquire()
    
    
    def test2(num):
        print("---test2---")
        print("test2 请求 mutex2")
        mutex2.acquire()
        print("test2 获得 mutex2")
        time.sleep(1)
        print("test2 请求 mutex1")
        mutex1.acquire()
       
    mutex1 = threading.Lock()
    mutex2 = threading.Lock()
    
    def main():
        t1 = threading.Thread(target=test1, args=(1000000,))
        t2 = threading.Thread(target=test2, args=(1000000,))
    
        t1.start()
        t2.start()
    
    if __name__ == "__main__":
        main()

    思考: 死锁如何避免?

    1. 我们可以使用time.time()来进行一个超时等待;

    2.银行家算法

     有需要的话可以关注我的微信公众号,会第一时间接收最新的知识。

  • 相关阅读:
    基于python内置方法进行代码混淆
    python-__getattr__ 和 __getattribute__
    python-flask学习
    python-创建进程的三种方式
    python-property、__get__、__set__
    call apply bind
    【算法】js实现最短时间走完不同速度的路程
    图片懒加载实现
    MoonLight可视化订单需求区域分析系统前端
    前端代码基本命名规范和格式规范
  • 原文地址:https://www.cnblogs.com/liudemeng/p/9143945.html
Copyright © 2020-2023  润新知