python中mulprocessing.Queue

  • Post author:
  • Post category:python


1.  put数据


1)          消息队列的长度


#


先进先出队列

>>> from multiprocessing importQueue

>>>


#


最多接收


1


个数据

>>> q=Queue(10)


# put


向队列中添加数据

>>> q.put(5)

>>> q.put(59)

>>>


#


获取当前队列的长度

>>> q.qsize()

2


#


取出最前面的一个数据

>>> q.get()

5

>>>


2)          超出时间

>>> from multiprocessing importQueue

>>>

>>> q=Queue(2)

>>>

>>>

>>> q.put(5)

>>> q.put(59)

>>>

>>> q.qsize()

2

>>>


#


超时时间为


2



>>> q.put(‘Tracy’,timeout=2)

Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

File “D:\Python27\lib\multiprocessing\queues.py”, line 102, input

raise Full

Queue.Full

>>>

现在队列的最大长度设置为2,当第三个数据向里面插入时,最多等待两秒,两秒后还没有进入到队列中就报错


3)          设置队列不阻塞

>>> from multiprocessing importQueue

>>> q=Queue(2)

>>>

>>> q.put(5)

>>> q.put(59)

>>>


#


设置队列不阻塞(当队列满的时候再插入数据,直接报错)

>>> q.put(‘tracy’,block=False)

Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

File “D:\Python27\lib\multiprocessing\queues.py”, line 102, input

raise Full

Queue.Full

>>>

>>> q.qsize()

2

>>>

默认程序会阻塞,等待新的值插入到队列当中,使用了

block=False

参数后,强制设置为不阻塞,一旦超出队列长度,立即抛出异常

2.  get数据


1) 设置超出时间

>>> from multiprocessing importQueue

>>> q=Queue(2)

>>>

>>> q.put(5)

>>> q.put(59)

>>>

>>> q.qsize()

2

>>> q.get()

5

>>> q.get()

59

>>>

q.get(timeout=2)

Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

File “D:\Python27\lib\multiprocessing\queues.py”, line 132, inget

raise Empty

Queue.Empty

>>>

当取值的次数大于队列的长度的时候就会产生阻塞,设置超时时间意为最多等待x秒,队列中再没有数据,就抛出异常


2) 设置不阻塞

>>> from multiprocessing importQueue

>>> q=Queue(2)

>>> q.put(5)

>>> q.put(59)

>>>

>>> q.qsize()

2

>>> q.get()

5

>>> q.get()

59

>>>

q.get(block=False)

Traceback (most recent call last):

File “<stdin>”, line 1, in <module>

File “D:\Python27\lib\multiprocessing\queues.py”, line 134, inget

raise Empty

Queue.Empty

>>>

获取队列的次数大于队列长度时,默认会阻塞,通过设置block=False来实现非阻塞,立即抛出异常

3.  Queue类


1)__init__:如果不给这个构造方法传参数,队列的长度为无限大


2)get():参数为是否阻塞和超时时间


3)get_nowait():非阻塞获取队列中的值


4)put()&&put_nowait():与get&&get_nowait同理


5)empty():检查队列是否为空,为空返回True,不为空返回False


6)full():判断队列是否已经满了


7)qsize():返回队列中元素的个数(真实个数)


8)join()&&task_done():multiprocessing.Queue中没实现

>>> import Queue

>>>

>>> q=Queue.Queue(2)

>>> q.put(5)

>>> q.put(59)

>>>

程序执行完这5行代码后会退出,退出前队列中还有值,退出后被清空

>>> import Queue

>>> q=Queue.Queue(2)

>>>

>>> q.put(4)

>>> q.put(23)

>>>

>>> q.get()

4

>>> q.get()

23

>>> q.join()

队列中插入两个元素,后面取出了两个元素,执行后你会发现,

程序还是卡在第


10


行的那个


join


代码

>>> import Queue

>>>

>>> q=Queue.Queue(2)

>>> q.put(4)

>>> q.put(23)

>>>

>>> q.get()

4

>>> q.task_done()

>>> q.get()

23

>>> q.task_done()

>>>

>>> q.join()

>>>

在每次get取值之后,还需要在跟队列声明一下,已经取出了数据并处理完毕,执行join代码的时候才不会被卡住



版权声明:本文为shaoqiufeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。