Pythonで理解する非同期プログラミング:マルチスレッディングとマルチプロセッシング

非同期プログラミングは、現代のソフトウェア開発において非常に重要なテーマです。特にPythonはそのライブラリと文法の柔軟性により、非同期プログラミングを容易に取り入れることができます。この記事では、Pythonでの非同期プログラミングの基本、特にマルチスレッディングとマルチプロセッシングに焦点を当てて説明します。

目次

非同期プログラミングとは?

非同期プログラミングとは、プログラムが一つのタスクが終了するのを待たずに次のタスクに移ることを可能にするプログラミングの手法です。

同期プログラミングとの違い

同期プログラミングでは、各タスクが順番に実行され、一つのタスクが完了するまで次のタスクが開始されません。一方で、非同期プログラミングでは、一つのタスクが他のタスクの完了を待たずに並行して実行することができます。

Pythonでの非同期プログラミングの種類

Pythonでは主に二つの非同期プログラミング手法があります:マルチスレッディングとマルチプロセッシングです。

マルチスレッディング

マルチスレッディングは、同じプロセス内で複数のスレッドを並行して実行する手法です。

基本的なコード例

import threading

def print_numbers():
    for i in range(10):
        print(i)

# スレッドの作成と開始
thread = threading.Thread(target=print_numbers)
thread.start()
# スレッドの終了を待つ
thread.join()

注意点

PythonのGlobal Interpreter Lock(GIL)の存在により、CPUバウンドな処理ではマルチスレッディングが効果的でない場合があります。

マルチプロセッシング

マルチプロセッシングは、複数のプロセスを並行して実行する手法です。

基本的なコード例

from multiprocessing import Process

def print_numbers():
    for i in range(10):
        print(i)

# プロセスの作成と開始
process = Process(target=print_numbers)
process.start()
# プロセスの終了を待つ
process.join()

注意点

マルチプロセッシングはメモリを多く消費する可能性がありますが、GILの影響を受けずに真の並列処理が可能です。

応用例

マルチスレッディングでのWebスクレイピング

import threading
import requests

def fetch_url(url):
    response = requests.get(url)
    print(f"Fetched content from {url}, length: {len(response.text)}")

urls = ['https://example.com', 'https://example.org', 'https://example.net']
threads = []

for url in urls:
    thread = threading.Thread(target=fetch_url, args=(url,))
    thread.start()
    threads.append(thread)

for thread in threads:
    thread.join()

マルチプロセッシングでの画像処理

from multiprocessing import Process
from PIL import Image, ImageFilter

def apply_filter(image_path):
    img = Image.open(image_path)
    img = img.filter(ImageFilter.CONTOUR)
    img.save(f"contour_{image_path}")

image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']
processes = []

for image_path in image_paths:
    process = Process(target=apply_filter, args=(image_path,))
    process.start()
    processes.append(process)

for process in processes:
    process.join()

まとめ

Pythonでの非同期プログラミングは、マルチスレッディングとマルチプロセッシングを用いて様々なケースでパフォーマンスを向上させることが可能です。しかし、それぞれの手法にはメリットとデメリットがあり、用途に応じて適切な選択が必要です。

コメント

コメントする

目次