08-多线程-共享全局变量

目标

  • 知道多线程能够共享全局变量数据

1. 共用全局变量

我们可以创建两个函数,在work1函数中对 全局变量 g_num的值修改,于此同时work2函数中获取g_num的值

import threading
import time

# 定义全局变量
num = 0


def work1():

    # 使用 global 声明全局变量,表示后续的操作,都是操作去全局变量num
    global num

    for i in range(10):
        num += 1

    print("work1 num = %d" % num)


def work2():

    print("work2 num = %d" % num)


if __name__ == '__main__':

    # 创建子线程
    t1 = threading.Thread(target=work1)
    t2 = threading.Thread(target=work2)
    # 启动子线程
    t1.start()
    t2.start()

    # while 循环的作用是:能保证子线程运行完毕,再去输出 num
    while len(threading.enumerate()) != 1:
        time.sleep(1)

    print("num = ", num)

    # 结论:全局变量可以在多个线程中进行共享使用

运行结果:

work1 num = 10
work2 num = 10
num =  10

Process finished with exit code 0

2. 列表做实参

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]

3. 总结

  • 在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
  • 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)