`multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。

本文涉及的产品
云原生网关 MSE Higress,422元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: `multiprocessing`是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。

1. multiprocessing模块概述

multiprocessing是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。这个模块提供了一个类似于threading模块的API,但它是基于进程的,而不是基于线程的。因此,它可以充分利用多核CPU的优势,并且由于进程间的内存隔离,它通常比线程更安全。

2. Pipe()

Pipe()函数用于在进程之间创建管道。管道是一个双向的、基于消息的通信通道,它允许两个进程之间进行数据交换。Pipe()函数返回一个由两个连接对象组成的元组,这两个对象分别表示管道的两端。

示例代码:

import multiprocessing

def worker(conn):
    # 从管道接收数据
    data = conn.recv()
    print(f"Worker received: {data}")
    # 发送数据回管道
    conn.send("Hello from worker!")

if __name__ == "__main__":
    # 创建一个管道
    parent_conn, child_conn = multiprocessing.Pipe()

    # 创建一个子进程并传递管道的一端
    p = multiprocessing.Process(target=worker, args=(child_conn,))
    p.start()

    # 向管道发送数据
    parent_conn.send("Hello from parent!")

    # 从管道接收数据
    result = parent_conn.recv()
    print(f"Parent received: {result}")

    # 等待子进程结束
    p.join()

代码解释:

  • 我们首先导入了multiprocessing模块。
  • 定义了一个名为worker的函数,该函数接收一个连接对象作为参数。这个函数从管道接收数据,打印它,然后发送一条消息回管道。
  • 在主程序中,我们使用multiprocessing.Pipe()创建了一个管道,并得到了两个连接对象:parent_connchild_conn
  • 我们创建了一个子进程,并将child_conn作为参数传递给worker函数。这样,子进程就可以通过child_conn与主进程通信了。
  • 在主进程中,我们使用parent_conn.send()向管道发送了一条消息。
  • 然后,我们使用parent_conn.recv()从管道接收子进程发送回来的消息,并打印它。
  • 最后,我们使用p.join()等待子进程结束。

3. Queue()

Queue()类是一个线程和进程安全的队列类,用于在进程之间传递数据。它实现了管道和锁定以提供同步。

示例代码:

import multiprocessing

def worker(q):
    # 从队列中取出数据并打印
    data = q.get()
    print(f"Worker received: {data}")
    # 将数据放入队列中
    q.put("Hello from worker!")

if __name__ == "__main__":
    # 创建一个队列
    q = multiprocessing.Queue()

    # 创建一个子进程并传递队列
    p = multiprocessing.Process(target=worker, args=(q,))
    p.start()

    # 向队列中放入数据
    q.put("Hello from parent!")

    # 等待队列中的数据被取出
    q.get()  # 注意:这里只是为了演示,通常不会在主进程中等待子进程的结果

    # 等待子进程结束
    p.join()

    # 从队列中取出子进程放入的数据
    result = q.get()
    print(f"Parent received: {result}")

代码解释:

  • Pipe()示例类似,我们首先导入了multiprocessing模块。
  • 定义了一个名为worker的函数,该函数接收一个队列对象作为参数。这个函数从队列中取出数据,打印它,然后向队列中放入一条消息。
  • 在主程序中,我们使用multiprocessing.Queue()创建了一个队列对象q
  • 我们创建了一个子进程,并将队列对象q作为参数传递给worker函数。这样,子进程就可以通过队列与主进程通信了。
  • 在主进程中,我们使用q.put()向队列中放入了一条消息。
  • 注意,在上面的代码中,主进程调用了q.get()来等待队列中的数据被取出。这
    处理结果:

    1. multiprocessing模块概述

    multiprocessing是Python的一个标准库,用于支持生成进程,并通过管道和队列、信号量、锁和条件变量等同步原语进行进程间通信(IPC)。这个模块提供了一个类似于threading模块的API,但它是基于进程的,而不是基于线程的。因此,它可以充分利用多核CPU的优势,并且由于进程间的内存隔离,它通常比线程更安全。

    2. Pipe()

    Pipe()函数用于在进程之间创建管道。管道是一个双向的、基于消息的通信通道,它允许两个进程之间进行数据交换。Pipe()函数返回一个由两个连接对象组成的元组,这两个对象分别表示管道的两端。

    示例代码:

    ```python
    def worker(conn)_

    从管道接收数据

    data = conn.recv()
    print(f"Worker received_ {data}")

    发送数据回管道

    conn.send("Hello from worker!")
    if name == "main"_

    创建一个管道

    parent_conn, child_conn = multiprocessing.Pipe()

    创建一个子进程并传递管道的一端

    p = multiprocessing.Process(target=worker, args=(child_conn,))
    p.start()

    向管道发送数据

    parent_conn.send("Hello from parent!")

    从管道接收数据

    result = parentconn.recv()
    print(f"Parent received
    {result}")

    等待子进程结束

    p.join()
  • 我们首先导入了multiprocessing模块。

    3. Queue()

    Queue()类是一个线程和进程安全的队列类,用于在进程之间传递数据。它实现了管道和锁定以提供同步。

    示例代码:

    ```python
    def worker(q)_

    从队列中取出数据并打印

    data = q.get()
    print(f"Worker received_ {data}")

    将数据放入队列中

    q.put("Hello from worker!")
    if name == "main"_

    创建一个队列

    q = multiprocessing.Queue()

    创建一个子进程并传递队列

    p = multiprocessing.Process(target=worker, args=(q,))
    p.start()

    向队列中放入数据

    q.put("Hello from parent!")

    等待队列中的数据被取出

    q.get() # 注意:这里只是为了演示,通常不会在主进程中等待子进程的结果

    等待子进程结束

    p.join()

    从队列中取出子进程放入的数据

    result = q.get()
    print(f"Parent received_ {result}")
  • Pipe()示例类似,我们首先导入了multiprocessing模块。
相关文章
|
3月前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
2月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
4月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
3月前
|
消息中间件 存储 Linux
|
3月前
|
Python
多进程同步之文件锁
【10月更文挑战第16天】文件锁是一种常用的多进程同步机制,它可以用于确保多个进程在访问共享资源时的互斥性。在使用文件锁时,需要注意锁的粒度、释放、竞争和性能等问题。通过合理使用文件锁,可以提高多进程程序的正确性和性能
|
4月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
57 0
Linux c/c++之IPC进程间通信
|
4月前
|
消息中间件 存储 网络协议
操作系统的心脏:深入理解进程间通信(IPC)机制
在现代计算机系统中,操作系统扮演着至关重要的角色,而进程间通信(IPC)作为操作系统的核心功能之一,极大地影响着系统的性能和稳定性。本文将通过浅显易懂的语言,详细探讨进程间通信的基本原理、主要类型及其实际应用,旨在为读者提供一个清晰且全面的理解和认识。 ##
252 1
|
5月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
5月前
|
机器学习/深度学习 Shell 开发工具
Python使用管道执行git命令报错|4-7
Python使用管道执行git命令报错|4-7
|
5月前
|
Python
python:cmd管道
python:cmd管道