curekoshimizu
「Pythonのスレッドは遅い」・「GILのせいで真の並列処理ができていない」こうした話は誰もが一度聞いたことがあるでしょう。しかし、Pythonスレッドの実体が何なのか、なぜそういう話がでているのかを実装レベルで理解している人は多くありません。
Python 3.13でついに実現したGIL無効化機能により、この状況は大きく変わろうとしています。しかし、NoGILモードを効果的に活用するためには、まず「Pythonスレッドとは何か」を深く理解する必要があります。
本発表では、CPythonのソースコードを読み解きながら、この根本的な問いに答えます。そもそも、threading.ThreadとThreadPoolExecutorの違いは?WebKitから着想を得た"Parking Lot"とは?NoGILで変わるスピンロックやeval_breakerの挙動は?
実装コードとともに、Pythonスレッドの正体とNoGIL時代の変化を理解する30分間です。
Pythonのスレッドは遅いと言われることがありますが、確かにCPUバウンドタスクでは遅く、 GILのせいで実質1スレッドでしか動作しておりませんでした。しかしながら、I/O待機中ではどうでしょう? こうした動きの違いをまずは説明します。
まずは、Pythonスレッドの基本となる、threading.TheradやThreadPoolExecutorの中身を説明します。これを実装レベルで理解すると、GILというものが遅さの主要因であることが見えてきます。
そもそも、なぜGILという考えがあったのかを説明します。それにより、スレッドというのはどのような動きになるのかを説明していきます。 その実装の紹介の中で、Parking Lotやスピンロック、eval_breakerといった用語についてもお話できると思います。
2020年代のマルチコア時代にPythonを加速するNoGILモードについて深く理解し、スレッドについて深く理解できるようにする、そんな30分になります。
プロフィール
京都大学理学部に首席で合格し京都大学大学院を経てエンジニアの道へ。新卒のFixstarsではExecutive Engineerとして組織リードし上場を経験。その後Mujinではアーキテクト。続くPreferred NetworksではEMを務めるとともに、物流部門の立ち上げを主導。HacobuではCTO室室長・研究開発部部長として着任。2024年5月よりRecustomerにCTOとして参画。Pythonは10年以上つかっており、大好きな言語です!