Pythonを使ってマルチスレッドでのファイルI/O(入出力)とネットワークI/Oを効率よく行う方法について解説します。具体的なコード例とその解説、さらには応用例を含めています。
目次
はじめに
マルチスレッドプログラミングは、リソースを効率よく活用するために不可欠なスキルの一つです。特に、ファイルI/OとネットワークI/Oの場合、多くの時間が待機時間として浪費されてしまうことが多いです。Pythonのthreadingモジュールを使用して、これらの処理を効率的に行う方法を学びましょう。
基本的なマルチスレッドの使い方
Pythonのthreadingモジュールは、軽量なスレッドを生成・操作するための高レベルAPIを提供します。
スレッドの作成と実行
import threading
# スレッドで実行する関数
def print_numbers():
for i in range(10):
print(i)
# スレッドの作成
thread = threading.Thread(target=print_numbers)
# スレッドの開始
thread.start()
# スレッドが終了するまで待つ
thread.join()
このコードでは、`print_numbers`関数を別のスレッドで実行します。`Thread`クラスの`target`引数に関数を指定することで、その関数が新しいスレッドで実行されます。
マルチスレッドでのファイルI/O
ファイルI/O処理は通常、I/Oバウンドであるため、マルチスレッドで効率を向上させることができます。
ファイルの読み書き
import threading
# ファイル読み込み関数
def read_file(filename):
with open(filename, 'r') as f:
print(f.read())
# ファイル書き込み関数
def write_file(filename, text):
with open(filename, 'w') as f:
f.write(text)
# スレッドの作成と実行
thread1 = threading.Thread(target=read_file, args=('example_read.txt',))
thread2 = threading.Thread(target=write_file, args=('example_write.txt', 'Hello, world!'))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
この例では、`read_file`と`write_file`関数をマルチスレッドで並行実行しています。
マルチスレッドでのネットワークI/O
HTTPリクエスト
import threading
import requests
# HTTPリクエスト関数
def fetch_url(url):
response = requests.get(url)
print(response.status_code)
# スレッドの作成と実行
thread1 = threading.Thread(target=fetch_url, args=('https://www.example.com',))
thread2 = threading.Thread(target=fetch_url, args=('https://www.example2.com',))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
応用例
ファイルの並列ダウンロード
import threading
import requests
# ファイルダウンロード関数
def download_file(url, filename):
r = requests.get(url)
with open(filename, 'wb') as f:
f.write(r.content)
# スレッドの作成と実行
thread1 = threading.Thread(target=download_file, args=('https://www.example.com/file1', 'file1.txt'))
thread2 = threading.Thread(target=download_file, args=('https://www.example.com/file2', 'file2.txt'))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
APIからの大量データ取得
import threading
import requests
# APIデータ取得関数
def fetch_api_data(api_url, params):
response = requests.get(api_url, params=params)
print(response.json())
# スレッドの作成と実行
thread1 = threading.Thread(target=fetch_api_data, args=('https://api.example.com/data1', {'key': 'value'}))
thread2 = threading.Thread(target=fetch_api_data, args=('https://api.example.com/data2', {'key': 'value'}))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
まとめ
Pythonでマルチスレッドを活用することで、ファイルI/OやネットワークI/Oの効率を大幅に向上させることができます。特にI/Oバウンドな処理においては、マルチスレッドは非常に有用です。しかし、CPUバウンドな処理に対しては、マルチスレッドの効果は限定的であることを理解しておきましょう。
コメント