Python3 的多进程模块 multiprocessing
提供了多种用于并行处理的功能,适用于各种场景。以下是一些常见的用途和场景:
用途
-
CPU 密集型任务:
多进程适用于需要大量 CPU 计算的任务,例如数值计算、数据处理、图像处理等。这些任务在单核上执行可能效率较低,通过多进程可以充分利用多核 CPU 提高效率。 -
I/O 密集型任务:
对于需要大量 I/O 操作的任务,例如文件读写、网络请求等,多进程可以在一个进程等待 I/O 完成时让其他进程继续执行,提升整体性能。 -
并行任务:
多进程可以同时执行多个彼此独立的任务,如并发执行多个数据分析任务、同时处理多个客户端请求等。
使用场景
-
数据处理和分析
在处理大数据时,可以将数据分块并行处理。例如,大量数据的清洗、转换和统计分析。from multiprocessing import Processdef process_data(data_chunk):# 处理数据块passdata_chunks = [data_chunk1, data_chunk2, data_chunk3] # 数据块列表processes = [] for chunk in data_chunks:p = Process(target=process_data, args=(chunk,))processes.append(p)p.start()for p in processes:p.join()
-
图像处理
图像处理任务通常是 CPU 密集型的,可以利用多进程加速。例如,批量处理图像(如调整大小、滤波等)。from multiprocessing import Pool from PIL import Imagedef process_image(image_path):img = Image.open(image_path)# 图像处理img = img.resize((100, 100))img.save(f"processed_{image_path}")image_paths = ["image1.jpg", "image2.jpg", "image3.jpg"]with Pool(processes=4) as pool:pool.map(process_image, image_paths)
-
网络爬虫
多进程可以用来并行抓取网页,提高爬取速度和效率。from multiprocessing import Pool import requestsdef fetch_url(url):response = requests.get(url)return response.texturls = ["http://example.com", "http://example.org", "http://example.net"]with Pool(processes=4) as pool:results = pool.map(fetch_url, urls)
-
并行任务执行
需要同时执行多个独立的任务,例如同时执行多个外部命令或脚本。from multiprocessing import Process import subprocessdef run_script(script_name):subprocess.run(["python3", script_name])scripts = ["script1.py", "script2.py", "script3.py"]processes = [] for script in scripts:p = Process(target=run_script, args=(script,))processes.append(p)p.start()for p in processes:p.join()
-
服务器和后台服务
在实现服务器和后台服务时,多进程可以用于处理多个客户端请求或后台任务,例如 Web 服务器、消息队列处理等。from multiprocessing import Process from http.server import HTTPServer, BaseHTTPRequestHandlerclass SimpleHandler(BaseHTTPRequestHandler):def do_GET(self):self.send_response(200)self.end_headers()self.wfile.write(b'Hello, World!')def run_server(port):server = HTTPServer(('localhost', port), SimpleHandler)server.serve_forever()ports = [8000, 8001, 8002]processes = [] for port in ports:p = Process(target=run_server, args=(port,))processes.append(p)p.start()for p in processes:p.join()
小结
Python 的 multiprocessing
模块提供了强大的多进程功能,适用于各种需要并行处理的场景。通过合理使用多进程,可以提高程序的效率和性能,充分利用多核 CPU 的计算能力。在使用多进程时需要注意进程间的通信和资源共享,以避免竞争条件和数据不一致的问题。