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()
此时我们就可以得到我们想要的答案了:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现