python中mulprocessing.Queue

本文介绍了Python的multiprocessing.Queue,包括put数据和get数据的操作。详细讲解了消息队列的长度、超时设置、非阻塞模式,以及Queue类的相关方法如get、put、empty、full等。示例代码展示了如何使用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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代码的时候才不会被卡住

Python中,`threading`库提供的`queue`和`multiprocessing`库提供的`Queue`都是用于线程间通信的数据结构,它们的主要目的是在多线程或多进程环境中同步数据传输。以下是两者的一些异同: **相似点:** 1. **线程安全**:两者都保证了队列内部的操作在并发环境下的安全性,避免了数据竞争。 2. **阻塞操作**:当试图从空队列中获取元素时,`queue`和`Queue`都会阻塞直到有新的数据加入。 3. **共享状态**:两个队列都无法直接让进程间共享状态,因为它们属于各自独立的内存空间。 **不同点:** 1. **进程隔离**:`multiprocessing.Queue`创建的是进程间的通信机制,适合在多进程环境下使用。而`threading.Queue`仅限于同一进程内的线程间。 2. **性能**:由于`multiprocessing.Queue`需要在进程间复制数据,因此它的性能通常不如`threading.Queue`,特别是在大量数据交换的情况下。 3. **同步粒度**:`threading.Queue`更适合轻量级的线程间通信,而`multiprocessing.Queue`则适用于更复杂的跨进程通信场景。 4. **使用限制**:`multiprocessing`库要求数据可以序列化,这意味着不是所有类型的对象都能直接放入`Queue`。`threading.Queue`不受此限制。 **示例代码(简化的版本):** ```python import threading from queue import Queue import multiprocessing # 线程队列示例 q_thread = Queue() # 进程队列示例 q_process = multiprocessing.Queue() # ... 线程和进程使用队列进行数据传递 ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值