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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: `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模块。
相关文章
|
12天前
|
调度 开发者 Python
Python中的异步编程:理解asyncio库
在Python的世界里,异步编程是一种高效处理I/O密集型任务的方法。本文将深入探讨Python的asyncio库,它是实现异步编程的核心。我们将从asyncio的基本概念出发,逐步解析事件循环、协程、任务和期货的概念,并通过实例展示如何使用asyncio来编写异步代码。不同于传统的同步编程,异步编程能够让程序在等待I/O操作完成时释放资源去处理其他任务,从而提高程序的整体效率和响应速度。
|
9天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
26 4
|
9天前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
20 2
|
7天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
14天前
|
文字识别 自然语言处理 API
Python中的文字识别利器:pytesseract库
`pytesseract` 是一个基于 Google Tesseract-OCR 引擎的 Python 库,能够从图像中提取文字,支持多种语言,易于使用且兼容性强。本文介绍了 `pytesseract` 的安装、基本功能、高级特性和实际应用场景,帮助读者快速掌握 OCR 技术。
30 0
|
1月前
|
Python
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
pip批量安装Python库 requirement.txt 离线环境无互联网环境下pip安装Python库
106 3
|
5月前
|
开发工具 git Python
安装和使用`libnum`是一个用于数字理论函数的Python库
【6月更文挑战第19天】`libnum`是Python的数字理论函数库。安装可通过`git clone`,进入目录后运行`python setup.py install`,也可用`pip install libnum`。示例:使用`int_to_hex`将十进制数42转换为十六进制字符串'2a'。注意,信息可能已过时,应查最新文档以确保准确性。如遇问题,参考GitHub仓库或寻求社区帮助。
116 1
|
4月前
|
Python
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装:
确保你已经安装了`python-barcode`库。如果没有,可以通过pip来安装:
|
Python
Anaconda虚拟环境安装Python库与Spyder
本文介绍在Anaconda中,为Python的虚拟环境安装第三方库与Spyder等配套软件的方法~
436 1
Anaconda虚拟环境安装Python库与Spyder
|
Linux Python
不可出外网的主机如何快速、方便、优雅的安装Python库?
不可出外网的主机如何快速、方便、优雅的安装Python库?
501 0
不可出外网的主机如何快速、方便、优雅的安装Python库?