当前位置: 首页 > article >正文

multiprocessing

`multiprocessing` 是 Python 的一个标准库,用于创建多进程。与多线程(`threading`)不同,`multiprocessing` 允许每个进程拥有自己的内存空间,这意味着它们不受全局解释器锁(GIL)的限制,可以在多核处理器上实现真正的并行计算。

### `multiprocessing` 的作用:

1. **并行计算**:可以利用多核处理器的能力,通过并行执行多个进程来提高计算效率。
2. **绕过 GIL**:由于每个进程有自己的 Python 解释器和内存空间,因此不受 GIL 的限制。
3. **简化 I/O 密集型任务**:可以并行执行多个 I/O 操作,提高效率。
4. **隔离性**:每个进程相互独立,一个进程的崩溃不会直接影响其他进程。
5. **资源共享**:可以通过特定的方式(如管道、队列、共享内存)在进程间共享数据。

### 简单的启动、停止和等待的用法:

#### 启动进程

创建进程的最简单方式是使用 `Process` 类。以下是创建和启动一个新进程的基本步骤:

from multiprocessing import Process

def worker(name):
    print(f"Launched process with ID: {name}")

if __name__ == '__main__':
    # 创建一个进程对象
    p = Process(target=worker, args=('12345',))
    # 启动进程
    p.start()
    # 等待进程结束
    p.join()

在这个例子中,`worker` 函数是新进程启动后要执行的目标函数。`Process` 类的 `target` 参数指定了这个函数,`args` 参数是一个元组,包含了传递给 `worker` 函数的参数。

#### 停止进程

在 `multiprocessing` 中,通常不推荐直接停止一个进程,因为这可能会导致资源泄露或者其他不稳定的行为。正确的做法是让子进程完成其任务后自然结束。如果确实需要停止一个进程,可以通过以下方式:

import time
from multiprocessing import Process, current_process

def worker():
    print(f"Process {current_process().pid} is running")
    time.sleep(5)  # 模拟长时间运行的任务
    print(f"Process {current_process().pid} is terminating")

if __name__ == '__main__':
    p = Process(target=worker)
    p.start()
    time.sleep(2)  # 让进程运行一会儿
    # 终止进程
    p.terminate()
    p.join()  # 等待进程结束

在这个例子中,`terminate()` 方法被用来强制终止进程。但请注意,这种方式可能会导致进程资源没有被正确清理。

#### 等待进程结束

使用 `join()` 方法可以等待进程结束:

p.join()

这个方法会阻塞调用它的线程,直到对应的进程结束。这对于确保主程序在子进程结束后再继续执行是很有用的。

### 注意事项

- 当使用 `multiprocessing` 时,通常需要在 `if __name__ == '__main__':` 块中启动进程,这是为了防止在 Windows 系统上出现递归地创建子进程的问题。
- 进程间通信需要使用 `multiprocessing` 提供的通信机制,如 `Pipe`、`Queue` 或共享内存。
- 进程的创建和销毁比线程要昂贵,因此在使用 `multiprocessing` 时应该考虑到这一点,合理规划进程的数量。
 


http://www.kler.cn/a/385930.html

相关文章:

  • JWTUtil工具类
  • 软件设计师 - 第1章 计算机网络概论
  • SystemVerilog学习——类的继承
  • Android ART知多少?
  • opencv kdtree pcl kdtree 效率对比
  • QSS 设置bug
  • [MySQL]索引
  • RK3568平台开发系列讲解(字符设备驱动篇)创建设备节点实验
  • ENAS和DARTs的比较
  • 1、了解家庭网络历史
  • InfluxDB性能优化指南
  • 用 Collections.synchronizedSet 创建线程安全的 HashSet
  • 健尔康在A股上市:市值84亿元,陈国平、陈麒宇父女成大赢家
  • 机器学习之集成学习算法
  • Mac M1下运行端到端语音模型Mini-Omni
  • 虚拟化数据恢复—XenServer虚拟机中SQL Server数据库数据恢复案例
  • STM32 BootLoader 刷新项目 (九) 跳转指定地址-命令0x55
  • GEE 案例——利用哨兵-2 图像时间序列和谷歌地球引擎云计算自动绘制和监测香港海洋水质参数
  • 蓝桥杯 Python组-神奇闹钟(datetime库)
  • 深入了解 curl:使用和功能详解
  • Android OpenGL ES详解——纹理过滤GL_NEAREST和GL_LINEAR的区别
  • 数据分析-41-时间序列预测之机器学习方法XGBoost
  • Spark Plan 之 SQLMetric
  • 电影插曲《牧羊曲》
  • 推荐一款面向增材制造的高效设计平台:nTopology
  • 新闻稿件管理:SpringBoot框架实战指南