第五章 爬虫进阶(七) 2020-01-24 祝简友新年快乐

七、 线程安全的队列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



以上资料内容来源网络,仅供学习交流,侵删请私信我,谢谢。

你可能感兴趣的:(第五章 爬虫进阶(七) 2020-01-24 祝简友新年快乐)