同个进程内的线程之间
,由于是在同一个内存空间,所以它们之间的数据可以共享
。
import threading
var = 0
def x1():
global var
var = 1
def x2():
print(var)
>>> t1 = threading.Thread(target=x1)
>>> t2 = threading.Thread(target=x2)
>>> t1.start()
>>> t1.join()
>>> t2.start()
# 结果 | x2线程 能获取得到 x1线程 的变量
1
线程与线程之间的数据虽然能共享,但是不同的线程,相互交错的读写同一个变量,很容易造成数据错落
。
Lock
机制是一把锁,当一个线程对数据操作完毕之后,别的线程才能对数据进行操作。
import threading
lock = threading.Lock()
n = 0
def run_thread(v):
# 锁
lock.acquire()
global n
n = v
print(n)
# 解锁
lock.release()
# lock.acquire 和 lock.release 之间,线程只能排队操作
>>> t1 = threading.Thread(target=run_thread, args=(5,))
>>> t2 = threading.Thread(target=run_thread, args=(8,))
>>> t1.start()
>>> t2.start()
# 结果
5
8
# 锁也不是完美的解决方案,有时会出现执行错乱,导致锁死,整个进程崩溃
ThreadLocal
是一个全局的字典
,用每个线程的名称做为key去存储和访问变量,这样每个线程之间的数据就变得独立,互相不受到干扰。
import threading
l = threading.local()
def a():
print(l.name)
def b(name):
l.name = name
a()
p1 = threading.Thread(target=b, args=(1,))
p2 = threading.Thread(target=b, args=(2,))
p1.start()
p2.start()
# 结果
1
2