欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python,多线程共享全局变量的问题

程序员文章站 2022-05-02 14:00:19
...

XXX.join( ):表示同步执行(使用注意,要加在启动线程之后)

主线程等待第一个线程执行完成以后代码再继续执行,让其执行第二个线程

import threading

# 定义全局变量
g_num = 0


# 循环一次给全局变量加1
def test1():
    for i in range(1000000):
        global g_num
        g_num += 1

    print("test1:", g_num)


# 循环一次给全局变量加1
def test2():
    for i in range(1000000):
        global g_num
        g_num += 1
    print("test2:", g_num)


if __name__ == '__main__':
    # 创建两个线程
    first_thread = threading.Thread(target=test1)
    second_thread = threading.Thread(target=test2)

    # 启动线程
    first_thread.start()
    # 主线程等待第一个线程执行完成以后代码再继续执行,让其执行第二个线程
    first_thread.join()  # join:表示同步执行
    # 同步: 一个任务执行完成以后另外一个任务才能执行,
    # 同一个时刻只有一个任务在执行
    print("第一个线程执行完啦")
    second_thread.start()


互斥锁( 同步锁 )

多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制

import threading


# 定义全局变量
g_num = 0

# 创建全局互斥锁
lock = threading.Lock()


# 循环一次给全局变量加1
def test1():
    # 上锁
    lock.acquire()
    for i in range(1000000):
        global g_num
        g_num += 1

    print("test1:", g_num)
    # 释放锁
    lock.release()


# 循环一次给全局变量加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()

    # 提示:加上互斥锁,那个线程抢到这个锁我们决定不了,先抢到锁线程先执行,没有抢到的线程需要等待
    # 加上互斥锁多任务瞬间变成单任务,性能会下降,也就是说同一时刻只能有一个线程去执行