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. 总结¶
- 在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据
- 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全)