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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: `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模块。
相关文章
|
4月前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
75 10
|
4月前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
73 6
|
4月前
|
消息中间件 Kafka 数据安全/隐私保护
Python IPC实战指南:构建高效稳定的进程间通信桥梁
【9月更文挑战第11天】在软件开发中,随着应用复杂度的提升,进程间通信(IPC)成为构建高效系统的关键。本文通过一个分布式日志处理系统的案例,介绍如何使用Python和套接字实现可靠的IPC。案例涉及定义通信协议、实现日志发送与接收,并提供示例代码。通过本教程,你将学会构建高效的IPC桥梁,并了解如何根据需求选择合适的IPC机制,确保系统的稳定性和安全性。
64 5
|
4月前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
31 3
|
3月前
|
Java C语言 Python
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
63 0
|
4月前
|
安全 开发者 Python
揭秘Python IPC:进程间的秘密对话,让你的系统编程更上一层楼
【9月更文挑战第8天】在系统编程中,进程间通信(IPC)是实现多进程协作的关键技术。IPC机制如管道、队列、共享内存和套接字,使进程能在独立内存空间中共享信息,提升系统并发性和灵活性。Python提供了丰富的IPC工具,如`multiprocessing.Pipe()`和`multiprocessing.Queue()`,简化了进程间通信的实现。本文将从理论到实践,详细介绍各种IPC机制的特点和应用场景,帮助开发者构建高效、可靠的多进程应用。掌握Python IPC,让系统编程更加得心应手。
44 4
|
4月前
|
消息中间件 网络协议 Python
工具人逆袭!掌握Python IPC,让你的进程从此告别单打独斗
【9月更文挑战第9天】你是否曾遇到多个Python程序像孤岛般无法通信,导致数据孤立、任务难协同的问题?掌握进程间通信(IPC)技术,可助你打破这一僵局。IPC是不同进程间传递数据或信号的机制,在Python中常用的方法有管道、消息队列、共享内存及套接字等。其中,管道适用于父子或兄弟进程间简单数据传递;套接字则不仅限于本地,还能在网络间实现复杂的数据交换。通过学习IPC,你将能设计更健壮灵活的系统架构,成为真正的编程高手。
33 3
|
4月前
|
消息中间件 数据库 Python
深度剖析!Python IPC的奥秘,带你走进进程间通信的微观世界
【9月更文挑战第8天】在编程世界中,进程间通信(IPC)是连接不同程序或进程的关键技术,使数据在独立进程间自由流动,构建复杂软件系统。本文将深入探讨Python中的IPC机制,包括管道、消息队列、套接字等,并通过具体示例展示如何使用Socket实现网络IPC。Python的`multiprocessing`模块还提供了队列、管道和共享内存等多种高效IPC方式。通过本文,你将全面了解Python IPC的核心概念与应用技巧,助力开发高效协同的软件系统。
55 2
|
4月前
|
消息中间件 数据采集 数据库
庆祝吧!Python IPC让进程间的合作,比团队游戏还默契
【9月更文挑战第7天】在这个数字化时代,软件系统日益复杂,单进程已难以高效处理海量数据。Python IPC(进程间通信)技术应运而生,使多进程协作如同训练有素的电竞战队般默契。通过`multiprocessing`模块中的Pipe等功能,进程间可以直接传递数据,无需依赖低效的文件共享或数据库读写。此外,Python IPC还提供了消息队列、共享内存和套接字等多种机制,适用于不同场景,使进程间的合作更加高效、精准。这一技术革新让开发者能轻松应对复杂挑战,构建更健壮的软件系统。
47 1
|
4月前
|
Linux C语言
C语言 多进程编程(七)信号量
本文档详细介绍了进程间通信中的信号量机制。首先解释了资源竞争、临界资源和临界区的概念,并重点阐述了信号量如何解决这些问题。信号量作为一种协调共享资源访问的机制,包括互斥和同步两方面。文档还详细描述了无名信号量的初始化、等待、释放及销毁等操作,并提供了相应的 C 语言示例代码。此外,还介绍了如何创建信号量集合、初始化信号量以及信号量的操作方法。最后,通过实际示例展示了信号量在进程互斥和同步中的应用,包括如何使用信号量避免资源竞争,并实现了父子进程间的同步输出。附带的 `sem.h` 和 `sem.c` 文件提供了信号量操作的具体实现。