python关于多线程使用全局变量的问题
python关于多线程使用全局变量的问题
在多线程中,如果多线程同时对一个全局变量进行操作时,就有可能出现异常,比如下面的程序:
# -*- coding:UTF-8 -*-
import threading
import time
#定义一个全局变量
g_num = 0
def test1(num):
global g_num
for i in range(num):
g_num += 1
print(g_num)
def test2(num):
global g_num
for i in range(num):
g_num += 1
print(g_num)
def main():
t1 = threading.Thread(target=test1,args=(10000000,))
t2 = threading.Thread(target=test2,args=(10000000,))
t1.start()
t2.start()
time.sleep(5)
print('结束:',g_num)
if __name__ == '__main__':
main()
运行后得到的结果本应是20000000,可是结果真是这样吗?运行后得到的结果是:

这是因为一个程序在未运行完全时就被停止而执行另一个程序了,从而导致这样的结果。
那么怎么解决这个问题呢?这里就用到了多线程的互斥锁。具体参见下面的程序:
# -*- coding:UTF-8 -*-
import threading
import time
#定义一个全局变量
g_num = 0
def test1(num):
global g_num
#上锁
mutex.acquire()
for i in range(num):
g_num += 1
#解锁
mutex.release()
print(g_num)
def test2(num):
global g_num
# 上锁
mutex.acquire()
for i in range(num):
g_num += 1
mutex.release()
print(g_num)
def main():
t1 = threading.Thread(target=test1,args=(10000000,))
t2 = threading.Thread(target=test2,args=(10000000,))
t1.start()
t2.start()
time.sleep(3)
print('结束:',g_num)
if __name__ == '__main__':
mutex = threading.Lock()
main()
此时我们就可以得到我们想要的答案了:


浙公网安备 33010602011771号