1. 背景
在读取文件时,希望能够利用 Python 的多进程并行读取多个文件。有时,我们是基于类去编写代码的,那么对于类的方法,Python 的多进程代码应该如何编写。
2. multiprocessing库介绍
multiprocessing
是 Python 标准库中的一个模块,用于实现并行计算和多进程处理。它提供了一个高级的接口,使得开发者可以在 Python 中方便地创建和管理多个进程,从而实现并行执行任务,提高程序的性能。
2.1 创建进程
multiprocessing
模块提供了 Process
类,可以通过它来创建新的进程。示例代码如下:
from multiprocessing import Process
def 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 Pool
def square(x):
return x * x
if __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, Queue
def 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, Lock
def 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 Process
process = []
class Test:
def __init__(self, input_file_paths):
self.input_file_paths = input_file_paths
def 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()
@staticmethod
def your_func(file_path: str):
...
if __name__ == "__main__":
Test(["/tmp/xx", "/tmp/xxxx"]).do()
for p in process:
p.join()