Python: Tornadoの非同期でアプリを書くのをあきらめたはなし

 最近GoogleAppEngineで動かしてたアプリをDockerコンテナへ移植した。そのフレームワークとしてノンブロッキングな非同期処理ができるTornadoを選んだのだが、書いている途中で非同期で書くのがしんどくなって同期に切り替えた。どのあたりがしんどかったのかをメモとして残しておく。

 Tornadoでは非同期で値を返すメソッドはreturnではなくyieldを使うようになっている。ジェネレータで使っていたyieldである。これがイマイチ非同期処理を行っているのかなんなのかキーワードとしてわかりにくかった。
 たとえばC#にはawaitというキーワードがあり、これが非同期処理の結果を待つことを示す。awaitはそのために作られた機能で、キーワードが示すのは一意の機能である。それと比較するとTornadoを使った場合ではちょっとだけコードが読みづらかった。

 そしてTornadoで書いていて、非同期処理になっていないのにyieldキーワードを使っているよ、とエラーを返されたが該当する行を示してくれなかった。これは処理を追っていけばどこがエラーを吐いているか把握できるのだが、そもそもふつうにやってればエラーを吐いた行なんて、苦労せずともエラー出力で示してくれるものである。そういうものをつぶしてまで非同期処理を選択する必要はなかったので、同期処理に切り替えてデバッグをシコシコとやっていった。同期はデバッグしやすい。

 要は今回移植したアプリが、わりとふつうのコードであることが自分の中では大事なことに気づいたので、ノンブロッキングな非同期をやめて同期で書いていった。もし今後非同期が必要になったら、個人的にはその場合はASP.NET MVCでいきたいと感じた。
 
comment: 0