16-多线程爬虫-Queue线程安全队列

Queue线程安全队列:
在线程中,访问一些全局变量,加锁是一个经常的过程。如果你是想吧一些数据存储到某个队列中,那么python内置了一个线程安全的模块叫做queue模块。
python中的queque模块中提供了同步的、线程安全的队列类,包括FIFO(先进先出)队列Queue,LIFO(后入先出)队列LifoQueue。
这些队列都实现了锁原语(可以理解为原子操作,即要么不做,要么都做完),能够在多线程中直接使用。可以使用队列来实现线程中的同步

注意
get():从队列中取最后一个数据。默认情况下时阻塞的,也就是说如果队列已经空了,那么再调用就会一直阻塞,直到有新的数据添加进来。也可以用"block=False"关掉阻塞。如果关掉阻塞,在队列为空的情况下获取就会抛出异常。
put():将一个数据放到队列中。跟get一样,在队列满了的时候也会一直阻塞,并且也可以通过"block=False"关掉阻塞,同样也会抛出异常。

 

# Queue线程安全队列

from queue import Queue

# 创建一个队列对象,大小为4(先进先出)
q = Queue(4)

# for x in range(4):
#     # 将数据放入到队列中
#     q.put(x)

# 当放入队列的数据个数,超过初始大小,会发生堵塞
for x in range(5):
    try:
        # block=False,是指当队列满时,后面再放入数据时不发生堵塞,直接报出错误
        q.put(x,block=False)
    except:
        break
        
if q.full():
    print("队列满了")

# qsize()函数,返回队列的大小
print("队列的大小:",q.qsize())

# get()函数,取出队列中的元素
# for x in range(q.qsize()):
#     value = q.get()
#     print(value,end="\t")

# 当获取队列的数据个数,超过初始大小,也会发生堵塞
for x in range(5):
    try:
        # block=False,是指当索引超过初始队列的大小,不发生堵塞,直接报出错误
        value = q.get(block=False)
        print(value,end="\t")
    except:
        break
        
if q.empty():
    print("\n队列空了")

print("完成")

执行结果

 

posted @ 2021-04-26 21:41  马铃薯1  阅读(176)  评论(0编辑  收藏  举报