文章目录
- 1. 背景
- 2. multiprocessing库介绍
- 2.1 创建进程
- 2.2 进程池
- 2.3 进程间通信
- 2.4 进程同步
- 3. 多进程读取文件代码
1. 背景
在读取文件时,希望能够利用 Python 的多进程并行读取多个文件。有时,我们是基于类去编写代码的,那么对于类的方法,Python 的多进程代码应该如何编写。
2. multiprocessing库介绍
multiprocessing
是 Python 标准库中的一个模块,用于实现并行计算和多进程处理。它提供了一个高级的接口,使得开发者可以在 Python 中方便地创建和管理多个进程,从而实现并行执行任务,提高程序的性能。
2.1 创建进程
multiprocessing
模块提供了 Process
类,可以通过它来创建新的进程。示例代码如下:
from multiprocessing import Processdef foo():print('Hello from a child process!')if __name__ == '__main__':p = Process(target=foo)p.start() # 启动子进程p.join() # 等待子进程结束
2.2 进程池
multiprocessing
还提供了 Pool
类,可以创建一个进程池,用于执行一组任务。示例代码如下:
from multiprocessing import Pooldef square(x):return x * xif __name__ == '__main__':with Pool(4) as pool: # 创建一个拥有4个进程的进程池result = pool.map(square, [1, 2, 3, 4, 5])print(result) # 输出:[1, 4, 9, 16, 25]
2.3 进程间通信
multiprocessing
模块提供了多种进程间通信的方式,如队列、管道、共享内存等。这些机制可以帮助不同进程之间安全地共享数据。示例代码如下:
from multiprocessing import Process, Queuedef worker(q):q.put('Hello from a child process!')if __name__ == '__main__':q = Queue()p = Process(target=worker, args=(q,))p.start()print(q.get()) # 从队列中获取数据p.join()
2.4 进程同步
multiprocessing
还提供了多种同步原语,如锁、信号量、事件等,用于在多个进程之间进行同步操作,避免竞态条件和数据访问冲突。示例代码如下:
from multiprocessing import Process, Lockdef f(lock, i):lock.acquire()print('Hello', i)lock.release()if __name__ == '__main__':lock = Lock()for num in range(10):Process(target=f, args=(lock, num)).start()
3. 多进程读取文件代码
如下,我们可以在类里或者类外定义一个需要并行执行的方法,例如下面的your_func
:
# -*- coding: utf-8 -*-
import os
import multiprocessing
from multiprocessing import Processprocess = []
class Test:def __init__(self, input_file_paths):self.input_file_paths = input_file_pathsdef do(self):for input_file_path in self.input_file_paths:p = Process(target=self.your_func, args=(input_file_path))process.append(p)p.start()@staticmethoddef your_func(file_path: str):...if __name__ == "__main__":Test(["/tmp/xx", "/tmp/xxxx"]).do()for p in process:p.join()