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