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()

此时我们就可以得到我们想要的答案了:
在这里插入图片描述

posted @   南瓜头pumpkin  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示