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

简介: `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月前
|
存储 人工智能 测试技术
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
本文介绍如何使用LangChain结合DeepSeek实现多轮对话,测开人员可借此自动生成测试用例,提升自动化测试效率。
2313 125
如何使用LangChain的Python库结合DeepSeek进行多轮次对话?
|
12月前
|
监控 数据可视化 数据挖掘
Python Rich库使用指南:打造更美观的命令行应用
Rich库是Python的终端美化利器,支持彩色文本、智能表格、动态进度条和语法高亮,大幅提升命令行应用的可视化效果与用户体验。
1015 0
|
11月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
697 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
11月前
|
数据可视化 关系型数据库 MySQL
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
本文详解基于Python的电影TOP250数据可视化大屏开发全流程,涵盖爬虫、数据存储、分析及可视化。使用requests+BeautifulSoup爬取数据,pandas存入MySQL,pyecharts实现柱状图、饼图、词云图、散点图等多种图表,并通过Page组件拖拽布局组合成大屏,支持多种主题切换,附完整源码与视频讲解。
978 4
【可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
747 18
|
12月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1748 102
|
12月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
550 104
|
12月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
453 103
|
12月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
458 82
|
11月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
571 3

推荐镜像

更多