Python 线程通信

线程通信

同个进程内的线程之间,由于是在同一个内存空间,所以它们之间的数据可以共享

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

线程与线程之间的数据虽然能共享,但是不同的进程,相互交错的读写同一个变量,很容易造成数据错落

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

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
Python 教程 Python 入门 Python 时间 Python JSON