`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模块。
相关文章
|
索引 Python
Python的变量和简单类型
本文介绍了Python中变量命名规则、常用变量类型及字符串操作。变量命名需遵循字母、数字和下划线组合,不能以数字开头且不可与关键字冲突。字符串支持单引号、双引号或三引号定义,涵盖基本输出、转义字符、索引、拼接等操作。此外,还详细解析了字符串方法如`islower()`、`upper()`、`count()`等,帮助理解字符串处理技巧。
328 15
|
人工智能 Python
[oeasy]python082_变量部分总结_variable_summary
本文介绍了变量的定义、声明、赋值及删除操作,以及Python中的命名规则和常见数据类型。通过示例讲解了字符串与整型的基本用法、类型转换方法和加法运算的区别。此外,还涉及异常处理(try-except)、模块导入(如math和random)及随机数生成等内容。最后总结了实验要点,包括捕获异常、进制转化、变量类型及其相互转换,并简述了编程中AI辅助的应用策略,强调明确目标、分步实施和逐步巩固的重要性。更多资源可在蓝桥、GitHub和Gitee获取。
345 97
|
10月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
存储 程序员 Python
Python 变量和简单数据类型
本文介绍了 Python 编程的基础知识,从创建第一个 Python 文件 `hello_world.py` 开始,讲解了 Python 文件的运行机制及解释器的作用。接着深入探讨了变量的定义、命名规则和使用方法,并通过示例说明如何修改变量值。同时,文章详细解析了字符串的操作,包括大小写转换、变量插入及空白字符处理等技巧。此外,还涵盖了数字运算(整数与浮点数)、常量定义以及注释的使用。最后引用了《Python 之禅》,强调代码设计的美学原则和哲学思想。适合初学者快速掌握 Python 基础语法和编程理念。
343 5
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
Python
[oeasy]python073_下划线在python里是什么含义_内部变量_私有变量_系统变量
本文回顾了Python中从模块导入变量和函数的方式,重点讨论了避免本地变量名冲突(local name clashes)的方法。通过`from module import variable as alias`可以为导入的变量重命名,防止冲突。根据PEP8规范,建议避免使用`from module import *`,因为它会导入模块中所有非下划线开头的变量,容易引发冲突。下划线在变量命名中有特殊含义:单个前导下划线表示内部变量,后置下划线用于避免与关键字冲突,双下划线前后包围表示系统变量。总结了下划线的不同用法及其作用。下次将继续探讨更实用的编程技巧。
284 3
|
存储 Python 容器
python之变量的使用
Python 中变量是对象的引用,赋值即为指向内存中对象。创建对象时,解释器分配内存,引用计数管理内存回收。Python 是动态类型语言,变量类型在运行时确定。对象分为可变与不可变,前者可修改内部状态,后者则不行。命名空间管理变量作用域,确保不同区域的变量独立。
351 11
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
747 0

推荐镜像

更多