ちょっとGo言語をはじめました

calendar

自前で運用しているPythonプログラムがあります。 かれこれ3年ぐらいかなぁ。 結構長く使ってます。 中身は統計解析で使うデータをデータベース(postgre)から引っ張ってきては適当な形に処理し、別のプログラムからアクセスできるようにするもので、要はAPIサーバーみたいなプログラムです。 一応ちゃんと動くんですが、処理がめちゃくちゃ遅いという問題があるんです。

理由は設計があまり良くないことに尽きると思うんですが、手っ取り早く解決する方法はマルチプロセス化だと思ってました。 なので週末にマルチプロセス化しようと色々試してたんですが、これが全然できないんですよねぇ…

Pythonではマルチプロセスとマルチスレッドが使えない?

最初はgeventっていう非同期処理のためのライブラリが影響しているのかと思ってたんですが、調べていくと「そもそも論」みたいな展開になりました。 どうもPythonでは非同期処理とマルチプロセス処理は同時に使えないっぽいんですよ。

もしかしたら上手く両立させる方法はあるのかもしれないですが、確実にほぼ全部書き直しのイメージが見えてますし、間違いなく面倒くさそうな雰囲気しか感じなかったもんですから、「いっそのこと言語も変えてしまおう!」ということになりました。

選んだのはGo言語です。 静的型付け言語ですので、この時点で処理速度が段違いです。

懐かしきGo言語、再び

実はGoはPythonを本格的に使い始める前に一度触っています。 5年くらい前です。 たしか1万行くらいのプログラムを書いた程度だと思うんですけど、とにかくマルチプロセス化がすごく楽だったという以外は覚えていませんでした。

てことで、とりあえず公式ドキュメントを読み直しましたけど、ほんっとにシンプルですよね。 とにかく覚えるべきことが少ない。 シンプルってのは良いことだなと再実感。

goroutineはとにかくすごい

今回の本丸のマルチプロセスですが、Goではゴルーチン(goroutine)ってのがそれにあたります。 Goでは非同期処理もマルチプロセス化もこれ一つでできちゃうって言うんですから、Python使いとしてはもう「なんて素晴らしいんだ…」という声しか出てきません。

実際に試してみましたけど、とにかく簡単に書けるし、それでいてめちゃくちゃ速いです。 僕の設計に問題有りな古いプログラムと比べちゃうと、たぶん100倍近い変化が起きるんじゃないかと今からワクワクしてます。

ただ、実際にコーディングしてみると気持ち悪いところも目立ちましたね。

Goの気持ち悪さ

宣言周りが気持ち悪い

「:=」っていう宣言と同時に代入できる演算子があるんですが、これは便利な反面、入力がしにくく、プログラミングのリズムが乱されます。

また、構造体のメンバーにmapを使ったものを入れると、自動的に初期化されないルールになっているみたいです。 構造体のインスタンス生成後に手動で割り当てる必要がありました。

「なんかなぁ…」っていうもやもや感がすごいです。

継承がない

継承はあまり良くないっていう論争が起きているのは知ってたんですが、実際になくなってみるとヤバイですね。 不自由さが。

そうはいってもGoでは継承っぽい方法が一応ありまして、構造体の埋め込みで対応できるみたいですが、実体は継承じゃなくて委譲です。 シングルトンみたいなデザインパターンのためのクラスを継承させて使い回す、みたいなことはおそらく不可能なんじゃないですか?

ということで、Pythonと全く同じことをさせようと思うと、全く違う設計にしないとダメそうです。

静的型付け言語ゆえの見にくくさ

Goは静的型付け言語ですので、変数の宣言や関数の引数や戻り値に対して常に型を宣言する必要があります。 必然的に記述量が増えるので、上手くファイル管理しないと簡単に見渡しが悪くなりそうです。

エラーの理由が分かりにくい

コンパイルが通ってもエラーが割と多く出るんですが、Pythonと比べると意味が分からない物が多い気がします。

また、github経由ライブラリのドキュメントも分かりにくいものが多いような…

Goはメインになりうる存在かもしれない

気持ち悪いポイントが幾つかあるものの、おそらく慣れれば問題ないレベルだと感じています。 むしろ僕がGoに触れた当初と比べ、ライブラリがかなり充実しており、Goのエコシステムに魅力を感じています。

いま一番気になっているのは、gopherdata/gophernotesというライブラリです。 Pythonで使っていたJupyter-NotebookをGoでも使えるようにするライブラリらしいです。

正直これが使い物になるのであれば、僕にとってはPythonをメインで使う意義はかなり薄れます。 状況次第では、Goがメイン、Javascriptがサブ、Pythonはその次くらいの脇役的存在まで落ちるかもしれません。

以上、今日はこれにて!

Some images are made by Freepik's icons from www.flaticon.com