共享全局变量

这是最简单的方法,也是最不线程安全的方法。
一个例子:

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()

这是一个很蠢的例子,但它演示了队列的工作方式,你会看到它打印的数字是连续的。

参考

https://www.cnblogs.com/ArsenalfanInECNU/p/10022740.html

标签: Python

添加新评论