17章futuresを使った並行処理

スレッドを非難するのはたいてい、普通のアプリケーションプログラマならまず遭遇することもないような利用事例しか念頭にないシステムプログラマです。(中略)アプリケーションプログラマが出くわす事例の99%で知らなければならないことは、それぞれ独立した一連のスレッドを生み出し、キューにそれらの結果を集めるというシンプルなパターンくらいです。

——Michele SimionatoPython思想家ブログ投稿「Threads, processes and concurrency in Python: some thoughts」より[17-01]†1

[†1] 冒頭の概要には「マルチコアの進化(あるいは非進化)とスレッドあるいはその他の並行処理に対する(願わくば)良識的なコメント」とあります。

本章ではconcurrent.futuresライブラリに焦点を当てます。これはPython 3.2で導入されましたが、Python 2.5以降でもPyPIのfuturesパッケージから利用できます。このライブラリは前述の引用文でMichele Simionatoが説明しているパターンをカプセル化することで、ほぼ何も考えずに使えるようにしたものです。

またここでは、タスクの非同期処理オブジェクトを表現するfuturesの考え方も紹介します。この背後にある偉大なアイデアはconcurrent.futuresにとどまらず、18章で取り上げるasyncioパッケージの基盤にもなっています。

それでは、やる気が出る例から始めましょう。

17.1 3種類のウェブダウンロードスクリプト

大きな遅延を伴うネットワークI/Oを効率的に処理するには、CPUサイクルを待ち時間で無駄に費やさず、ネットワークから応答があるまでは別の処理を実行する並行処理が必要です ...

Get Fluent Python ―Pythonicな思考とコーディング手法 now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.