python中线程使用与全局变量加锁

本文详细介绍了在Python中如何使用互斥锁(mutex)进行线程间的同步,防止多个线程同时修改全局变量导致的数据不一致问题。通过两个函数func1和func2的实例,展示了如何在循环中正确地获取和释放锁,确保数据的安全性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# -*- coding:utf-8 -*-
import threading
import time
from time import sleep, ctime

g_num = 0
# 创建互斥锁,默认不上锁
mutex = threading.Lock()


def func1(num):
    global g_num
    for i in range(num):
        mutex.acquire()  # 上锁
        g_num += 1
        mutex.release()  # 解锁
    print('--func1--g_num:%d' % g_num)


def func2(num):
    global g_num
    for i in range(num):
        mutex.acquire()
        g_num += 1
        mutex.release()
    print('--func2--g_num:%d' % g_num)


if __name__ == "__main__":
    t1 = threading.Thread(target=func1, args=(100000,))
    t1.start()
    t2 = threading.Thread(target=func2, args=(100000,))
    t2.start()

    while True:
        length = len(threading.enumerate())
        print('now the all thread:%d' % length)
        if length <= 1:
            break

        sleep(1)

    print('the result--%d' % g_num)

### Python 中线共享变量的处理 在Python中,当多个线访问同一个资源(即共享变量)时,可能会发生数据竞争条件。为了防止这种情况并确保数据一致性,Python 提供了几种机制来同步线间的操作。 #### 使用锁(Locks) 锁是一种简单的互斥原语。它不是可重入的,这意味着如果尝试在一个已经持有的锁上调用`acquire()`,将会阻塞直到超时或永远等待下去。下面是一个使用锁的例子: ```python from threading import Lock, Thread lock = Lock() shared_variable = 0 def increment_with_lock(): global shared_variable for _ in range(100000): with lock: temp_var = shared_variable temp_var += 1 time.sleep(0.00001) # Simulate some processing delay. shared_variable = temp_var thread_1 = Thread(target=increment_with_lock) thread_2 = Thread(target=increment_with_lock) thread_1.start() thread_2.start() thread_1.join() thread_2.join() print(f'Shared variable value after using locks: {shared_variable}')[^1] ``` 这段代码展示了如何通过引入锁对象来保护对共享变量的操作,从而避免竞态条件的发生。 #### GIL 对于原子性的保障 值得注意的是,由于CPython解释器内部存在全局解释器锁(GIL),这使得即使是在多核处理器上运行的多线应用序也只会在任意时刻执行单一线的字节码指令序列。因此,在某些情况下,默认情况下不需要额外加锁即可实现一定度上的“伪并发”。然而,对于涉及I/O或其他长时间运行的任务来说,解除GIL仍然是必要的以充分利用硬件资源[^3]。 #### 不同线间共享变量的行为观察 考虑如下简单案例,其中定义了一个名为 `a` 的整型全局变量,并创建了两个函数分别由不同线调用来修改和读取这个变量: ```python import threading import time a = 0 def modify_a(): global a print('Thread 1:', end=' ') a = 10 print(a) time.sleep(5) a = 11 print('After sleep in thread 1:', a) def read_a(): print('Thread 2 before sleep:', a) time.sleep(6) print('Thread 2 after sleep:', a) t1 = threading.Thread(target=modify_a) t2 = threading.Thread(target=read_a) t1.start() t2.start() t1.join() t2.join() ``` 此脚本说明了在线之间传递信息的方式之一;但是请注意,这里并没有采取任何措施去控制访问顺序或者保证可见性,所以实际应用中应当谨慎对待此类设计模式[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力减肥的小胖子5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值