0
点赞
收藏
分享

微信扫一扫

Freemarker模板 jar!/BOOT-INF/classes!/**.html

书呆鱼 2024-11-13 阅读 3

`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` 时应该考虑到这一点,合理规划进程的数量。
 

举报

相关推荐

0 条评论