Python线程间通信
共享全局变量
这是最简单的方法,也是最不线程安全的方法。
一个例子:
import time
import threading
i = 0
def test():
global i
while 1:
i += 1
#time.sleep(0.3)
def test2():
global i
while 1:
i += 1
#time.sleep(0.3)
if __name__ == '__main__':
t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test2)
t1.start()
t2.start()
for a in range(100):
print(i)
结果好像好像出现了倒车。
OUTPUT: 42271 51380 51605 52942 53799 53823 55059 61042 63469 61928
由于线程速度太快,一个线程刚拷贝值,另一个已经赋值了,正要拷贝时,另一个线程赋值,拷贝到旧值,导致变量内容的回退。
Queue 队列
队列是线程安全的线程间的通信方式。队列有三种模式:先进先出(Queue),后进后出(LifoQueue),以及优先级(PriorityQueue)(权重) 。
一个例子:
import threading
from queue import Queue
def test(q):
while 1:
i = q.get() #得到压入的数据
print(i)
q.put(i + 1) #压入
def test2(q):
while 1:
i = q.get() #如果另一个线程已经取到数据,直到在它压入数据前,都会阻塞这里,除非设置了超时时间为0
print(i)
q.put(i + 1)
if __name__ == '__main__':
q = Queue(1) #新建队列大小为1的一个先进先出队列
q.put(0) #压入一个数值
t1 = threading.Thread(target=test,args=(q,))
t2 = threading.Thread(target=test2,args=(q,))
t1.start()
t2.start()
这是一个很蠢的例子,但它演示了队列的工作方式,你会看到它打印的数字是连续的。