一、介绍

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('生产者们完成!')

四、书籍推荐

“周志华老师的《机器学习》(西瓜书)是机器学习领域的经典入门教材之一,周老师为了使尽可能多的读者通过西瓜书对机器学习有所了解, 所以在书中对部分公式的推导细节没有详述,但是这对那些想深究公式推导细节的读者来说可能“不太友好”,本书旨在对西瓜书里比较难理解的公式加以解析,以及对部分公式补充具体的推导细节。”

并且本书还有配套的视频讲解,通过书籍和视频一起来加深公式理解。

multiprocessing共享自定义对象_机器学习

multiprocessing共享自定义对象_数据_02

multiprocessing共享自定义对象_开发语言_03

multiprocessing共享自定义对象_python_04