07-互斥锁import threading# 定义全局变量g_num = 0# 创建全局的互斥锁lock

Posted 我在黑马的日子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了07-互斥锁import threading# 定义全局变量g_num = 0# 创建全局的互斥锁lock相关的知识,希望对你有一定的参考价值。



07-互斥锁


import threading






# 定义全局变量


g_num = 0






# 创建全局的互斥锁


lock = threading.Lock()




# 任务1 循环给全局变量每次加1


def test1():


    # 上锁


    lock.acquire()


    for i in range(1000000):


        global g_num


        g_num += 1




    print("test1:", g_num)


    # 释放锁


    lock.release()






# 任务2 循环给全局变量每次加1


def test2():


    # 上锁


    lock.acquire()


    for i in range(1000000):


        global g_num


        g_num += 1




    print("test2:", g_num)


    # 释放锁


    lock.release()






if __name__ == '__main__':


    first_thread = threading.Thread(target=test1)


    second_thread = threading.Thread(target=test2)




    first_thread.start()


    second_thread.start()




    # 提示:互斥锁能保证同一时刻只能有一个线程去执行,注意点:如果加上互斥锁多任务瞬间变成单任务,性能变低了。


------------------------------------------------



08-核心代码上锁-----------------------------------


import threading






# 定义全局变量


g_num = 0






# 创建全局的互斥锁


lock = threading.Lock()




# 任务1 循环给全局变量每次加1


def test1():




    for i in range(1000000):


        # 上锁


        lock.acquire()


        global g_num


        g_num += 1


        # 释放锁


        lock.release()




    print("test1:", g_num)








# 任务2 循环给全局变量每次加1


def test2():




    for i in range(1000000):


        # 上锁


        lock.acquire()


        global g_num


        g_num += 1


        # 释放锁


        lock.release()




    print("test2:", g_num)








if __name__ == '__main__':


    first_thread = threading.Thread(target=test1)


    second_thread = threading.Thread(target=test2)




    first_thread.start()


    second_thread.start()




    # 提示:互斥锁能保证同一时刻只能有一个线程去执行,注意点:如果加上互斥锁多任务瞬间变成单任务,性能变低了。


    # 提示: 如果只关系结果不关心线程的执行顺序可以使用互斥锁,如果想要按照一定顺序同步执行可以使用join


-----------------------------------------------


09-死锁-----------------------------------------


# 死锁:相互等待对方释放的锁,但是对方一直不释放就称为死锁


import threading


import time




# 创建全局互斥锁


lock = threading.Lock()






# 取值操作,保证同一时刻只能由一个线程去取值


def get_value(index):


    # 上锁,保证同一时刻只能有一个线程去取值


    lock.acquire()


    print(threading.current_thread())


    my_list = [4, 6, 7, 9]


    if index >= len(my_list):


        print("下标越界:", index)


        # 释放锁


        lock.release()


        return


    # 根据下标去在列表中取值


    value = my_list[index]


    print(value)


    time.sleep(0.001)


    # 释放锁


    lock.release()






if __name__ == '__main__':


    # 模拟大量线程同时去取值


    for i in range(10):


        sub_thread = threading.Thread(target=get_value, args=(i,))


        # 启动线程


        sub_thread.start()


------------------------------------------------












    



以上是关于07-互斥锁import threading# 定义全局变量g_num = 0# 创建全局的互斥锁lock的主要内容,如果未能解决你的问题,请参考以下文章

Python Threading 线程/互斥锁/死锁/GIL锁

为啥不可能将互斥锁传递给线程?

pthreads等待和信号疑问linux

一些问题可以帮助我确保了解互斥锁 [关闭]

python学习第33天

[RT-Thread]互斥锁(mutex)