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("完成")
执行结果