Pythonでは、queue
モジュールとconcurrent.futures
モジュールを使用して、複数のスレッドやプロセス間で情報を安全に交換することができます。
queueモジュール
queue
モジュールは、マルチプロデューサ、マルチコンシューマキューを実装しています。このモジュールは、スレッド間で情報を安全に交換するために特に有用です。queue
モジュールは、FIFOキュー、LIFOキュー、優先度キューの3種類のキューを実装しています。
concurrent.futuresモジュール
concurrent.futures
モジュールは、Python3.2から追加され、複数の処理を並列実行するための機能を提供します。このモジュールは、複数のスレッド・プロセスを扱うことを目的としています。
並行処理の例
以下に、concurrent.futures
モジュールとqueue
モジュールを使用した並行処理の例を示します。
from concurrent.futures import ThreadPoolExecutor
from queue import Queue
import time
def task(v):
print(f"{v} start")
time.sleep(1.0)
print(f"{v} end")
return v * 2
def main():
q = Queue()
# タスクをキューに追加
for i in range(5):
q.put(i)
with ThreadPoolExecutor(max_workers=2) as executor:
futures = []
while not q.empty():
v = q.get()
futures.append(executor.submit(task, v))
# タスクの結果を取得
for future in futures:
print(future.result())
if __name__ == "__main__":
main()
このコードでは、ThreadPoolExecutor
を使用してタスクを並列に実行し、queue
モジュールのQueue
クラスを使用してタスクを管理しています。各タスクは1秒間スリープした後、その値の2倍を返します。main
関数では、5つのタスクをキューに追加し、それらを並列に実行しています。最後に、各タスクの結果を表示しています。
このように、Pythonのqueue
モジュールとconcurrent.futures
モジュールを組み合わせることで、複数のタスクを効率的に並列処理することができます。