一、介绍
multiprocessing.Queue()
是 Python 中 multiprocessing
模块中的一个类,用于在多个进程之间进行通信和数据交换。它可以在多个进程之间安全地传递消息和数据,是一种线程安全的队列实现。
在使用 multiprocessing.Queue()
时,需要注意避免在多个进程之间传递可变对象(如列表、字典等),因为这可能会导致意外的行为。最好传递不可变对象(如整数、字符串等)或使用 multiprocessing.Manager
来创建共享数据结构。
multiprocess.Queue() 是跨进程通信队列,不能用于multiprocessing.Pool多进程的通信。
进程池 multiprocessing.Pool() 的多进程之间的通信要用 multiprocessing.Manager().Queue()
二、函数介绍
参数
def __init__(self, maxsize=0, *, ctx)
maxsize:是队列中允许的最大项数。如果省略此参数,则无大小限制。
方法
put(item[, block[, timeout]]):将 item
放入队列。
put_nowait():同 put()。
get([block[, timeout]]):从队列中取出一个元素。
get_nowait():同 get()。
注意:当一个队列为空的时候如果再用get取则会堵塞,所以取队列的时候一般是用到
get_nowait()方法,这种方法在向一个空队列取值的时候会抛一个Empty异常
所以更常用的方法是先判断一个队列是否为空,如果不为空则取值。
qsize():返回队列中当前的元素数量。
empty():如果队列为空则返回 True
,否则返回 False
。
full():如果队列已满则返回 True
,否则返回 False
。
close():关闭队列,表示不再向队列中添加数据。
join_thread():等待队列中的所有数据被处理完。
cancel_join_thread():取消队列中的所有数据被处理完。
三、代码测试
测试代码1
# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email: m21z50c71@163.com
# @VX:fylaicai
import multiprocessing
import time
def producer(data):
while True:
for i in range(10):
i += 1
data.put(i)
time.sleep(1)
def consumer(data):
while True:
result = data.get()
print("接收到的数据为:", result)
if __name__ == "__main__":
data = multiprocessing.Queue()
Producer = multiprocessing.Process(target=producer, args=(data, ))
Producer.start()
Consumer = multiprocessing.Process(target=consumer, args=(data, ))
Consumer.start()
测试代码2
# -*- coding:utf-8 -*-
# @author: 木子川
# @微信公众号: AI算法与电子竞赛
# @Email: m21z50c71@163.com
# @VX:fylaicai
from multiprocessing import Process, Queue
import time, random, os
def consumer(q):
while True:
res = q.get()
# 收到结束信号则结束
if res is None: break
time.sleep(random.randint(1, 3))
print(f'消费者:{os.getpid()},{res}')
def producer(q):
for i in range(2):
time.sleep(random.randint(1, 3))
q.put(i)
print(f'生产者: {os.getpid()}, {i}')
if __name__ == '__main__':
q = Queue()
# 生产者们
p1 = Process(target=producer, args=(q,))
# 消费者们
c1 = Process(target=consumer, args=(q,))
p1.start()
c1.start()
p1.join()
# 发送结束信号
q.put(None)
print('生产者们完成!')
四、书籍推荐
“周志华老师的《机器学习》(西瓜书)是机器学习领域的经典入门教材之一,周老师为了使尽可能多的读者通过西瓜书对机器学习有所了解, 所以在书中对部分公式的推导细节没有详述,但是这对那些想深究公式推导细节的读者来说可能“不太友好”,本书旨在对西瓜书里比较难理解的公式加以解析,以及对部分公式补充具体的推导细节。”
并且本书还有配套的视频讲解,通过书籍和视频一起来加深公式理解。