こんにちは。株式会社サイバーエージェントの芝田(@c-bata)です。
サイバーエージェントでは、技術者が最新のテクノロジーを吸収する機会を設けるため、海外・国内の技術系カンファレンスやイベントへの積極的な参加を促すためのサポートが行われています。その一つとしてGitHubに公開しているOSSのスター数に応じてインセンティブが得られる「GitHubスターインセンティブ」という制度があります。今回はこの制度を利用して、弊社エンジニアの石川(@rinov)とともにEuroPython 2018に参加しました。
EuroPythonとは
EuroPythonはヨーロッパ最大級のPythonのカンファレンスで、今回開催されたEuroPython 2018は1200人以上の参加者と100を超えるセッションが発表されました。 参加者はPython初心者の方から有名ライブラリのコア開発者の方までと多様で、Pythonに興味がある方ならどなたでも楽しめるカンファレンスです。 開催地は年度により異なることが多いですが、今年はイギリスのエディンバラ(Edinburgh)で開催されました。 Pythonにまつわる幅広い内容のセッションが行われ、セッション毎に「Beginner」「Intermediate」「Advanced」のいずれかがラベリングされており、自分の聞きたい内容・レベルに合わせて聴講することができます。
本レポートでは、EuroPythonの雰囲気や気になったセッションの内容をお届けします。
会場とスケジュールについて
開催地であるエディンバラへ到着すると、日本の夏と異なり、湿度が多くないため、日差しが射していても蒸し暑さを感じない印象でした。
エディンバラの夏は気温が平均10度〜20度と過ごしやすい気候で、海が近いため常に心地よい風が吹いています。
会場であるエディンバラ国際会議場に到着すると、チケットの認証とともに数多くのグッズやTシャツなどが配布されました。会場にはブースが設置され各協賛企業のプロダクト説明やグッズの配布が行われていました。私(石川)はIntelさんのブースでTシャツを頂きました。
ブースの近くには常時利用できる電源タップ、飲み物が提供され、セッションの合間の休憩や、交流の場として活用されていました。
スケジュールは基調講演から始まり、最大7つのセッションが並列で開催されました。午前は3セッション、午後は4セッションが行われ、2セッション毎にコーヒーブレイクの時間が設けられており、集中力を切らさずに各セッションに望めるスケジュールでした。
夕方にはセッションが終わり、その後、基調講演とライトニングトークが行われ一日が終わります。
基調講演
- タイトル:Die Threads
- 発表者:David Beazley
- セッション動画
初日の基調講演は David Beazley氏(@dabeaz)による「Die Threads」という発表でした。
David Beazley氏は『Python Essential Reference』と『Python Cookbook』(邦訳:『Python クックブック 第2版』)の著者で、Pythonに大きく貢献した一人とも言えます。
PyConやO'Reilly Open Source Conventionの委員会担当などを経て、2002年にPSF(Pythonソフトウェア財団)のフェローに選出されました。
また、Beazley氏の発表はPythonのコアな内容を実際にコードを披露しながら行う、ライブコーディングでの発表スタイルが多く、常に多くのPythonistに有益な情報を提供しています。
- Twitter:@dabeaz
- GitHub:https://github.com/dabeaz
概要
この基調講演では、スレッドプログラミングにおけるスレッドグループやキャンセルなどの高度な機能をPythonスレッドプログラミングに与えたときの可能性について言及しています。
また、実験的なライブラリとして作成されたthredo
を用いたライブコーディングのデモを行いました。
発表で使用されたライブラリ(thredo)
Pythonには2つの世界があり、それは同期、非同期ですが、なぜ私たちは非同期プログラミングを選ぶのでしょうか?
例えばTwitter、FacebookのようなSNSを思い浮かべてみましょう。
1つのユースケースとして非同期プログラミングのメリットはスケーリングです。ですが、大量のクライアントがいない場合でも非同期プログラミングは使われます。一つの理由としてはGIL(グローバルインタプリタロック)を回避するためなどが挙げられます。
しかし、非同期プログラミングと一概に言ってもPythonでは、async/await
のように自らタスクスケジューラで管理するケースや、threading
モジュールのようにOSカーネルのスレッドを使用するケースがあります。async/await
がある今、threading
は過去のものでしょうか?
この講演では、Pure Pythonのスレッドでの非同期な振る舞いについて、さまざまな検証を行いました。
ライブコーディングデモ
ライブコーディングでは実際にスレッド、スレッドグループに対してキャンセルした場合の挙動やPythonスレッドプログラミングでのその解決策のアイデアについて説明をしました。
また、スレッドのキャンセル操作により、どういったケースでスレッドが死ぬのか、また、その時の振る舞いはどのようになるのかについて実験を行いました。
- ロックを待つスレッドをキャンセルしたらどうなるのか?
- ロックを取得しているスレッドをキャンセルしたらどうなるのか?
- 「食事する哲学者の問題」で発生するデッドロックの再現と解決策
- QueueとThreadGroupを使った時のキャンセルの挙動
まとめ
講演中では実験的なライブラリ「thredo」を用いましたが、後にCurio上に実装されていることが明らかにされました。
非同期プログラミングとしてのスレッド上でのやり取りは、Beazley氏が数年前から検討してきたトピックです。
より詳細なスレッド間のやり取りや、ブロッキング操作については、こちらでまとめられていますので、興味がある方は是非読んでみてください。
今回紹介されたPythonのスレッドの振る舞いは、OSカーネルでブロッキング操作をするのではなく、非同期ライブラリ側でブロッキング操作をするスレッドライブラリを構築できることを示唆し、この方法を利用することで、タスクグループやキャンセルなどの高度な概念の操作を手に入れることができるというPythonスレッドプログラミングの可能性を再認識できる内容でした。
また、最後にBeazley氏は「スレッドがブロックする場合に、これがOSのブロッキングではなく、非同期イベントループで行われているということは重要な概念です。つまり、もしあなたが現代的なスレッドライブラリを作るならばasyncioを使って実装するでしょう」と言及しました。