Pythonで理解するグリーンスレッドとネイティブスレッドの違いと活用方法

この記事では、Pythonでのグリーンスレッドとネイティブスレッドの違い、それぞれの活用シーン、コード例を紹介します。具体的なコード例とその解説、応用例を含めて、Pythonでのスレッディングをより効率的に行うための知識を得ることができます。

目次

はじめに:グリーンスレッドとネイティブスレッドとは

グリーンスレッドとネイティブスレッドは、プログラムが複数のタスクを同時に処理するための手段です。しかし、どちらもスレッドと呼ばれるだけで、その実装と性能には大きな違いがあります。

グリーンスレッド

グリーンスレッドは、OSレベルでのスレッドを使用せず、プログラム(通常はランタイムやライブラリ)が管理するスレッドです。Pythonでは「gevent」や「Greenlet」などのライブラリで簡単に実装できます。

ネイティブスレッド

対照的に、ネイティブスレッドはOSが直接管理するスレッドです。Pythonの`threading`モジュールがこれに該当します。

基本的な使い方とコード例

グリーンスレッドの基本的な使い方

from gevent import monkey; monkey.patch_all()
import gevent

def task1():
    print("Task 1 running")
    gevent.sleep(2)  # 仮想的なI/O処理
    print("Task 1 complete")

def task2():
    print("Task 2 running")
    gevent.sleep(1)  # 仮想的なI/O処理
    print("Task 2 complete")

gevent.joinall([
    gevent.spawn(task1),
    gevent.spawn(task2)
])

上記のコードでは、`gevent`を使用して二つのタスクを非同期で実行しています。`gevent.sleep()`関数は仮想的なI/O処理を模擬しています。

ネイティブスレッドの基本的な使い方

import threading
import time

def task1():
    print("Task 1 running")
    time.sleep(2)  # 実際のI/O処理
    print("Task 1 complete")

def task2():
    print("Task 2 running")
    time.sleep(1)  # 実際のI/O処理
    print("Task 2 complete")

thread1 = threading.Thread(target=task1)
thread2 = threading.Thread(target=task2)

thread1.start()
thread2.start()

thread1.join()
thread2.join()

このコードでは、Pythonの`threading`モジュールを使用しています。`time.sleep()`はI/O処理を模擬しています。

応用例

グリーンスレッドでのWebスクレイピング

from gevent import monkey; monkey.patch_all()
import gevent
import requests

# Webページを取得するタスク
def fetch_page(url):
    print(f"Fetching {url}")
    response = requests.get(url)
    print(f"Content length: {len(response.text)}")

gevent.joinall([
    gevent.spawn(fetch_page, 'https://www.google.com'),
    gevent.spawn(fetch_page, 'https://www.yahoo.com')
])

上記のコードでは、`gevent`と`requests`ライブラリを使用して、複数のWebページを非同期に取得しています。

ネイティブスレッドでのデータ処理

import threading

# リストデータを処理するタスク
def sum_numbers(numbers):
    total = sum(numbers)
    print(f"Total sum: {total}")

# データ
data1 = [1, 2, 3, 4, 5]
data2 = [5, 4, 3, 2, 1]

thread1 = threading.Thread(target=sum_numbers, args=(data1,))
thread2 = threading.Thread(target=sum_numbers, args=(data2,))

thread1.start()
thread2.start()

thread1.join()
thread2.join()

この例では、リスト内の数字を合計するシンプルなタスクを非同期で実行しています。

まとめ

Pythonでのグリーンスレッドとネイティブスレッドは、それぞれ異なるシナリオで有用です。グリーンスレッドはI/Oバウンドな作業に適しており、ネイティブスレッドはCPUバウンドな作業でよく用いられます。どちらの方法も理解し、適切に使い分けることが、効率的なプログラミングに繋がります。

コメント

コメントする

目次