たごもりすメモ

コードとかその他の話とか。

flex_remote_apiあらためremote_driverとなりました

前のエントリ appengine ja night #13 に行ってきたよ&しゃべってきたよ - tagomorisのメモ置き場 で書いたとおり flex_remote_api という名前をやめて remote_driver としました。
githubリポジトリ名も変えたのでURLが変わってます。こちら。 tagomoris/remote_driver · GitHub

何かいい感じの名前がないかなーとしばらく考えてたんだけどあんまり思い付かなかったので、大してひねらず。まあ全身全霊をこめた一世一代のプロダクト、みたいなもんでもないし、紛れがなければそれでいいです。
前回のエントリ からいちおうあれこれ改良してあるので、その内容をざっと書いておく。

例外処理をハンドルするようにした

エラーが起きてappspot側で処理が異常終了した場合、それを検出して remote_driver_shell 側でその旨を出力するようにした。
ただし起きたエラーの内容やスタックトレースなどは現状取得する手段がないので、表示できない。何でもかんでもエラーを except してJob Entityに書き込むって方法もとれなくはないかもしれないけど、そこまでするかなーって感じ。
後述するが非同期呼び出しだと複数のジョブが並列で走ったりするので、その場合にエラーをどう表示するかとか考えるとかなり面倒。なので今のところはいいや。
エラーがよく起きるからなんとか表示してよ○○えもん! という人がいたら教えてください。そのときに考えます。

非同期呼び出しを実装

前のエントリで書いていた通り、非同期でのジョブ実行を実装した。
remote_async ディレクティブで実行内容を指定して remote_async_wait ディレクティブで現在実行中の非同期処理のwaitを行う。

数分以上かかる処理を並列でやれるのは便利だと思うんだけど API call quota には更にひっかかりやすくなるので要注意。

関数呼び出し形式の実装

ディレクティブ形式だと値を戻す関数の戻り値が受け取れないので、これが受け取れるよう、次のような関数呼び出し形式を実装した。

num = remote_sync(create_testdata(100))
num = remote_sync(TestData.all().count())
remote_async search_some_values(target_1)
remote_async search_some_values(target_2)
remote_async search_some_values(target_3)
result1, result2, result3 = remote_job_results() # wait and return values

なお、この形式でも複数行にわたる式の呼び出しには未対応、なので注意。だってめんどくさいんだもの。

また remote/remote_async ディレクティブや remote_sync() 関数などを実行するとジョブIDがコンソールに表示される。このジョブIDがわかっていれば、過去に実行したジョブの返り値を remote_job_results() 関数で再度取得することができる。

sync_result_1, sync_result_2, async_result_1 = remote_job_results(1111, 2222, 3333)

もし、ジョブの結果を使って別の処理をやらないといけないのに関数呼び出し形式を使うのを忘れてしまった! ということがあっても、これを知っていればジョブそのものの再実行を行わなくても済む。

Windows対応

自分は別にいらなかったんで放置する構えを見せてたら @najeira さんがパッチを送ってくれた。わーい。ということでWindowsでも動くようになりました。

ということで

使ってみた人は感想を @tagomoris までお寄せいただくと本人がとっても喜びます!