Look at all this work based on asyncio!

Python 3.5.0のはなし。

Guido のツイート。

@gvanrossum
Look at all this work based on asyncio! https://t.co/3nuMBLHrN6

気付いてなかったわけじゃないんだけど Python 3.5.0 のはなしではワタシの個人的趣味も反映して「@演算子」の話だけを紹介したんだけれど、3.5 の新機能

  • coroutines with async and await syntax.
  • a new matrix multiplication operator: a @ b.
  • additional unpacking generalizations.

などで、とりわけ最初の async and await が注目の目玉、なのよね。

スクリプト言語の「マルチコア活用」は Python だけでなく「GIL」的な設計を取っていれば共通で簡単じゃなかったわけね。事実特に Python 2.7 までの threading は、「コア活用」の役にはほとんど立たない。2.7 まではティック数が(確か) 100 固定なので、「重い100ティック」と「軽い100ティック」の並列は「重い方」にひきずられてしまうため。3になってここがダイナミックに変更になって、少しマシになったものの、threading がコア活用の役にはあまり立たない事実は変わらなかった。それが GIL の宿命。GIL は簡単に言えば「同時に動ける命令行は全スレッドまたいでただ一つ」という制御。こうすることで特に「C 拡張モジュール」の実装が簡単になる、という恩恵があるわけ。マルチコア大活躍させようにも threading では活用機会は限られていた

そして GIL 境界を超えればコア活用出来るので、multiprocessing が充実し、一応これなら「コア活用」出来た。けれども multiprocessing はプロセスを起こすのであって、スレッドと違い「生成コスト」が馬鹿にならない。fork 可能な Unix ではこのコストは比較的小さいが、fork 出来ない Unix、fork なんか設計されたことすらない Windows では、出来る OS に較べて 10倍の生成コストを支払う必要があった。要するに「小さなタスクの並列」にはまったく使えなかったわけだ。

詳しく調べていないのでわからないんだけれど、この async and await は、OS のネイティブスレッドを使ってくれていて欲しい。どうなんだろう? GIL そのものから逃れられるのかどうかも、そうであって欲しい。単に「楽に threading 出来る」だけならワタシは嬉しくないな。

もしも、だ。この async and await がワタシの思う「理想のそれ」である場合。

思うに「Ruby にユーザを一気に持っていかれ」る要因となったのが Ruby on rails なのは疑いようもない事実。ワタシは Ruby on rails 経験はなくて素の Ruby しか知らないんだけど、Python ユーザが Ruby を羨ましいと思うものはいくつかあって、どれも「WEB アプリケーションを作りやすい」ことに関係している:

  • 高度なテンプレートエンジンが標準搭載(ERB)
  • YAML インフラの開発のアクティビティが高く、安心して使える(これは設定ファイルの発明の乱立を防ぐ)

そして Rails。なのでワタシだって「WEB アプリケーション作りたいなら Ruby の方がいいかもよ」とだいたい答えてる、知人には。Python にも使いやすい WEB フレームワークはもちろんあるけれど、Ruby on rails ほどの「絶対的なコレ」はなくて、まぁ乱立した中から選ぶしかない。

(ちなみに private が使えるとか include 出来るなんか 1bit も羨ましいと思わない。かなりどうでもいい、これらは。)

でさ。async and await が最初に大活躍出来る場所って、どう考えても WEB サーバ系でしょ。無論これを大活躍させる「キラーアプリケーション」は出てくるのはこれからだろうけど、少なくとも Python 本体の async and await は、Ruby on rails に流れたユーザを Python に戻すだけの潜在力を持っている、かもしれない。

もともと Python を好むユーザと Ruby を好むユーザには、「言語の差」では測れないが歴然とした差があって、前者が「科学技術系」寄りの人々が好み、後者が WEB 系エンジニアが好むのね。わかると思うけどこれは当然「Python には NumPy/SciPy がある」「Ruby には Rails がある」という、それぞれのキラーアプリケーションに直接対応している。これがもし、「WEB 系も」と Ruby on rails のお株を奪ってしまうようなことになったら? これが起こらないとは言い切れない。

まぁ別にワタシは Ruby を目の敵にしてるとかは全然ないんだけれど、ただなんとなく「Ruby のテリトリーを奪う」Python は、見れたらなんとなく嬉しい。Python 好きとしては。

なんにせよアレだ。「.0 なんだからまだ気が早い」ことは言えるにせよ、3.5 が「いよいよ本格的に 3 へ移行する」決断を促進するものになるだろうな、とは思う。マルチバージョンサポートにはツラいことになるけどな。six はどう対応するだろうか?












23:00追記
ちょっとワタシ勘違いしてたわ。asyncio そのものは 3.4 で導入されてんのね。3.5 のはそれが言語コア機能になって、文法がこれをサポートするようになった、ということみたい。

なので「理想の」の部分は登場してるとすれば 3.4 のほうかもしんない。(ただ、ライブラリではなく言語レベルでのサポートって、「贔屓される」からね。ライブラリ使うのより良いとかあってもおかしくない。)