Python多线程共享全局变量是一个比较常见的需求,但是需要考虑到线程安全性和性能问题。
当多个线程同时访问同一个全局变量时,可能会导致数据竞争问题,使用线程锁可以解决这个问题。线程锁其实就是一把钥匙,当一个线程持有锁时,其他线程无法访问该变量,只有等到锁被释放后才能继续访问。
import threading
total = 0
lock = threading.Lock()
def add():
global total
# 获取锁
lock.acquire()
for i in range(1000000):
total += 1
# 释放锁
lock.release()
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=add)
t1.start()
t2.start()
t1.join()
t2.join()
print(total)
在Python中,每个线程都有自己的本地变量,这些变量只对当前线程可见,不会和其他线程进行共享。
import threading
total = 0
local = threading.local()
def add():
global total
for i in range(1000000):
local.total += 1
# 当前线程执行完之后,将本地 total 的值累加到全局变量 total 上
total += local.total
t1 = threading.Thread(target=add)
t2 = threading.Thread(target=add)
t1.start()
t2.start()
t1.join()
t2.join()
print(total)
在以上示例中,使用 threading.local()
函数创建一个线程局部变量 local
,对于每个线程来说,都可以独立地对 local
进行操作,最后再将各个线程中的 local.total
到全局变量 total
中。
多线程共享全局变量既有优点又有劣点,需要开发者根据实际需求和应用场景进行合理的选择。对于性能要求比较高的场景,可以通过使用线程锁或线程局部变量等方式来解决数据竞争和性能问题。