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 的計算能力。在使用多進程時需要注意進程間的通信和資源共享,以避免競爭條件和數據不一致的問題。