Python教程:深入理解 Python multiprocessing.Queue

简介: 在 Python 编程中,多进程编程是利用计算机多核心资源的重要手段之一。然而,多进程之间的通信却是一个相对复杂的问题。在本文中,我们将深入探讨 Python 中的 multiprocessing.Queue 模块,它为多进程间的通信提供了便捷而高效的解决方案。

 在 Python 编程中,多进程编程是利用计算机多核心资源的重要手段之一。然而,多进程之间的通信却是一个相对复杂的问题。在本文中,我们将深入探讨 Python 中的 multiprocessing.Queue 模块,它为多进程间的通信提供了便捷而高效的解决方案。

1. 简介


multiprocessing.Queue 是 Python 多进程编程中的一种进程间通信(IPC)机制,它允许多个进程之间安全地交换数据。与线程间通信相比,多进程间通信更加复杂,因为每个进程有自己独立的内存空间,无法直接共享数据。multiprocessing.Queue 解决了这个问题,提供了一个线程安全的队列,多个进程可以通过该队列传递数据。

2. 基本操作


2.1 创建队列

首先,我们需要导入 multiprocessing 模块,并创建一个 multiprocessing.Queue 对象:

import multiprocessing
queue = multiprocessing.Queue()

image.gif

2.2 向队列中放入数据

我们可以使用 put() 方法向队列中放入数据:

queue.put("Hello")
queue.put(123)

image.gif

2.3 从队列中获取数据

使用 get() 方法可以从队列中获取数据:

data1 = queue.get()
data2 = queue.get()

image.gif

2.4 判断队列是否为空

我们可以使用 empty() 方法来检查队列是否为空:

if not queue.empty():
    print("Queue is not empty")

image.gif

2.5 获取队列的大小

使用 qsize() 方法可以获取队列的大小:

size = queue.qsize()
print("Queue size:", size)

image.gif

3. 进程间通信示例:生产者-消费者模型


生产者-消费者模型是一种常见的并发编程模式,用于解决多个线程(或进程)之间共享数据的问题。它通常涉及两种类型的实体:生产者和消费者。

  1. 生产者:负责生成数据或者执行任务,并将其放入共享的缓冲区(队列)中。
  2. 消费者:负责从缓冲区中获取数据,并进行相应的处理或者消费。

生产者和消费者之间通过共享的缓冲区进行通信,这个缓冲区可以是一个队列、缓冲池等数据结构。生产者将数据放入缓冲区,而消费者则从缓冲区中取出数据进行处理,从而实现了生产者和消费者之间的解耦。

生产者-消费者模型的优点在于它可以有效地控制资源的利用率和任务的执行顺序,同时能够避免资源竞争和死锁等并发编程中常见的问题。

下面我们通过一个生产者-消费者模型的示例来演示 multiprocessing.Queue 的使用:

import multiprocessing
import time
def producer(queue):
    for i in range(5):
        item = f"Item {i}"
        queue.put(item)
        print(f"Produced {item}")
        time.sleep(1)
def consumer(queue):
    while True:
        item = queue.get()
        if item is None:
            break
        print(f"Consumed {item}")
        time.sleep(2)
if __name__ == "__main__":
    queue = multiprocessing.Queue()
    producer_process = multiprocessing.Process(target=producer, args=(queue,))
    consumer_process = multiprocessing.Process(target=consumer, args=(queue,))
    producer_process.start()
    consumer_process.start()
    producer_process.join()
    queue.put(None)
    consumer_process.join()

image.gif

在这个示例中,生产者进程负责向队列中放入数据,消费者进程负责从队列中获取数据并进行处理。通过 multiprocessing.Queue 实现了生产者和消费者之间的数据交换。

4.项目实战

以下是一个简单的实际爬虫项目场景的示例,其中使用了消息队列的生产者-消费者模型。在这个示例中,生产者负责从某个网站上爬取数据,并将数据放入消息队列中,而消费者则负责从队列中获取数据并进行处理。

import multiprocessing
import requests
from bs4 import BeautifulSoup
# 生产者函数:爬取网页内容,并将内容放入队列中
def producer(url, queue):
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    # 假设需要爬取网页中的所有链接
    links = [link.get('href') for link in soup.find_all('a')]
    queue.put(links)
# 消费者函数:从队列中获取数据,并进行处理
def consumer(queue):
    while True:
        data = queue.get()
        if data == 'STOP':
            break
        for link in data:
            # 在这里可以进行进一步处理,比如访问链接、提取信息等
            print("Processing link:", link)
if __name__ == "__main__":
    # 创建消息队列
    queue = multiprocessing.Queue()
    # 启动生产者进程
    producer_process = multiprocessing.Process(target=producer, args=('http://example.com', queue))
    producer_process.start()
    # 启动消费者进程
    consumer_process = multiprocessing.Process(target=consumer, args=(queue,))
    consumer_process.start()
    # 等待生产者进程结束
    producer_process.join()
    # 向队列中放入结束信号
    queue.put('STOP')
    # 等待消费者进程结束
    consumer_process.join()

image.gif


目录
相关文章
|
2天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 4
SciPy 教程之 SciPy 稀疏矩阵 4:介绍稀疏矩阵的概念、类型及其在科学计算中的应用。SciPy 的 `scipy.sparse` 模块提供了处理稀疏矩阵的工具,重点讲解了 CSC 和 CSR 两种格式,并通过示例演示了如何创建和操作 CSR 矩阵。
20 3
|
3天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 2
SciPy教程之SciPy稀疏矩阵2:介绍稀疏矩阵的概念、应用场景及scipy.sparse模块的使用。重点讲解CSC和CSR两种稀疏矩阵类型及其常用方法,如data属性和count_nonzero()方法。
23 4
|
10天前
|
Python
SciPy 教程 之 SciPy 模块列表 6
SciPy教程之常量模块介绍:涵盖公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率及力学单位。示例展示了角度单位转换为弧度的几个常用常量。
15 7
|
10天前
|
Python
SciPy 教程 之 SciPy 模块列表 7
`scipy.constants` 模块提供了常用的时间单位转换为秒数的功能。例如,`constants.hour` 返回 3600.0 秒,表示一小时的秒数。其他常用时间单位包括分钟、天、周、年和儒略年。
14 6
|
7天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
11 1
|
9天前
|
Python
SciPy 教程 之 SciPy 模块列表 9
SciPy教程之常量模块介绍,涵盖多种单位类型,如公制、质量、角度、时间、长度、压强等。示例展示了如何使用`scipy.constants`模块查询不同压强单位对应的帕斯卡值,包括atm、bar、torr、mmHg和psi。
10 1
|
9天前
|
Python
SciPy 教程 之 SciPy 模块列表 8
SciPy教程之常量模块单位类型介绍。该模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例展示了部分长度单位的转换值,例如英寸、英尺、海里等。
12 1
|
11天前
|
知识图谱 Python
SciPy 教程 之 SciPy 模块列表 5
本教程介绍SciPy常量模块中的单位类型,涵盖公制、质量、时间、长度等单位。示例代码展示了如何使用`scipy.constants`模块获取不同质量单位的千克值,如公吨、磅、盎司、原子质量单位等。
11 1
|
1天前
|
算法 Python
SciPy 教程 之 SciPy 图结构 1
SciPy 图结构教程介绍了图的基本概念及其在算法中的应用。图由节点和边组成,节点代表对象,边表示对象间的连接。SciPy 的 `scipy.sparse.csgraph` 模块提供了处理图结构的工具。邻接矩阵用于表示节点间的连接关系,分为有向图和无向图两种类型。无向图的边是双向的,而有向图的边则有明确的方向。
8 0
|
1天前
|
存储 Python
SciPy 教程 之 SciPy 稀疏矩阵 5
SciPy 稀疏矩阵教程介绍了稀疏矩阵的概念及其在科学计算中的应用。SciPy 的 `scipy.sparse` 模块提供了处理稀疏矩阵的功能,主要使用 CSC(压缩稀疏列)和 CSR(压缩稀疏行)两种格式。通过示例展示了如何创建 CSR 矩阵、查看非零元素及转换为 CSC 格式。
10 0