七、 线程安全的队列Queue
在线程中,访问一些全局变量,加锁是一个经常的过程。如果你是想把一些数据存储到某个队列中,那么Python内置了一个线程安全的模块叫做queue模块。Python中的queue模块中提供了同步的、线程安全的队列类,包括FIFO(先进先出)队列Queue,LIFO(后入先出)队列LifoQueue。这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么都做完),能够在多线程中直接使用。可以使用队列来实现线程间的同步。相关函数如下:
初始化Queue(maxsize):创建一个先进先出的队列。
1、qsize():返回队列的大小。
2、empty():判断队列是否为空。
3、full():判断队列是否满了。
4、get():从队列中取最后一个数据。默认情况下是阻塞的,也就是说如果队列已经空了,那么再调用就会一直阻塞,直到有新的数据添加进来。也可以使用‘block=False’,来关掉阻塞。如果关掉了阻塞,在队列为空的情况获取就会抛出异常。
5、put():将一个数据放到队列中。跟get一样,在队列满了的时候也会一直阻塞,标签也可以通过block=False来关掉阻塞,同样也会抛出异常。
示例代码:
import queue
import random
import time
import threading
# q= queue.Queue(4) #创建队列
#
# for x in range(5):
# try:
# q.put(x, block=False) #在队列中依次插入0、1、2、3元素,block=False 为非阻塞模式,若队列满则报错
# except:
# break
#
# if q.full():
# print("满了")
#
# # print(q.qsize())
#
#
# for x in range(5):
# try:
# value = q.get(block=False)
# except:
# break
# print(value)
#
# if q.empty():
# print("空了")
#
#
print("完成")
def add_value(q):
while True:
q.put(random.randint(0, 10))
time.sleep(1)
def get_value(q):
while True:
print("获取到的值:%d" % q.get())
def main():
q = queue.Queue(10)
th1 = threading.Thread(target=add_value,args=[q])
th2 = threading.Thread(target=get_value,args=[q])
th1.start()
th2.start()
if__name__ == '__main__':
main()
上一篇文章 第五章 爬虫进阶(六) 2020-01-23 地址:
https://www.jianshu.com/p/3096657cebfc
下一篇文章 第五章 爬虫进阶(八) 2020-01-25 地址:
https://www.jianshu.com/p/5876c4b0d8b4
以上资料内容来源网络,仅供学习交流,侵删请私信我,谢谢。