app engineと非同期とテストと私
TRANSCRIPT
App Engineと非同期とテストと私
おまえ誰よ?
•村岡友介 a.k.a @jbking•プログラマ have to look the job board for food!• App Engine ユーザ• Love asynchronous processing• Love TDD (and also BDD)
発表の流れ•自己紹介•発表の流れ ← いまここ•今日いいたいこと•非同期処理•非同期処理とテスト•非同期処理とテストと私•まとめ
今日いいたいこと
• 自己紹介
• 発表の流れ
• 今日いいたいこと ← いまここ
• 非同期処理
• 非同期処理とテスト
• 非同期処理とテストと私
• まとめ
... even on App Engine.
SeeAsynchronous processing everywhere.
It’s fun.
非同期処理
• 自己紹介
• 発表の流れ
• 今日いいたいこと
• 非同期処理 ← いまここ
• 非同期処理とテスト
• 非同期処理とテストと私
• まとめ
非同期処理使ってますか?
ですよねー
非同期IO (Asynchronous I/O) あるいは非ブロッキングIO(non-blocking I/O)とは、入出力の完了を待たずに、システムコールが終了する入出力処理の実装の事である。たとえば、ダイレクト・メモリ・アクセスで動作するファイル操作であれば、メインメモリ上に存在するデータに対してDMA転送を開始しても、ディスク上に転送が終了するまで、数msの待ち時間が必要になる。この間に、コンピュータはマルチタスク処理で多重処理を行うことが出来るが、処理を発行したプロセスやタスクは、処理の完了を待たなくてはならない。しかし非同期IOでは、処理を発行したプロセスやタスクは、入出力処理の完了を待つことなく、自身の処理を進めることが可能になる。したがって、入出力命令を連続して発行することが可能になり、シングルプロセスのプログラムでも、自身の入出力を多重し、複数の入出力処理を同時並行化できる。このため、時間制約の厳しい、リアルタイムオペレーティングシステムの入出力システムコールでは、このタイプの実装が多い。
http://ja.wikipedia.org/wiki/非同期IO
非同期IO (Asynchronous I/O) あるいは非ブロッキングIO(non-blocking I/O)とは、入出力の完了を待たずに、システムコールが終了する入出力処理の実装の事である。たとえば、ダイレクト・メモリ・アクセスで動作するファイル操作であれば、メインメモリ上に存在するデータに対してDMA転送を開始しても、ディスク上に転送が終了するまで、数msの待ち時間が必要になる。この間に、コンピュータはマルチタスク処理で多重処理を行うことが出来るが、処理を発行したプロセスやタスクは、処理の完了を待たなくてはならない。しかし非同期IOでは、処理を発行したプロセスやタスクは、入出力処理の完了を待つことなく、自身の処理を進めることが可能になる。したがって、入出力命令を連続して発行することが可能になり、シングルプロセスのプログラムでも、自身の入出力を多重し、複数の入出力処理を同時並行化できる。このため、時間制約の厳しい、リアルタイムオペレーティングシステムの入出力システムコールでは、このタイプの実装が多い。
http://ja.wikipedia.org/wiki/非同期IO
CPUを無駄にしない
技術
•プログラミング言語 Java Script, Ruby, Erlang, Oz, any event driven or multi-(or co-)thread capable language. Also the Python.
•ライブラリ redis, RabbitMQ, 0MQ.
• POSIX select, poll, message queue, pthread, fork, signal.
•ハードウェア Direct Memory Access (DMA), Interrupt ReQuest(IRQ).
Python
•言語 ジェネレータ (yield文)
• POSIX os.fork(), subprocess, multiprocessing, threading, select, signal, etc...
•ライブラリ Tornado, Twisted, meinheld, Eventlet, gevent, greenlet, stackless, etc...
App Engine
•機能 Task Queue API, Cron.
•ライブラリ deferred.defer().
•制約 フロントエンドとCronのHTTPリクエストは30秒以内に処理が終わらなければならない. タスクは10分以内.
非同期処理とテスト
• 自己紹介
• 発表の流れ
• 今日いいたいこと
• 非同期処理
• 非同期処理とテスト ← いまここ
• 非同期処理とテストと私
• まとめ
Python
•そもそも 外界との通信による待ちを減らす技術なのでテストしづらい.
•ユニットテスト 通信部分にパッチ.
•ファンクショナルテスト 通信先をエミュレート.
•フレームワーク Twisted Trial.
•パッチ geventとかは標準APIにパッチあてるので差を気にする必要がない.
App Engine
タイプ 開発環境
本番環境 非同期
NoseGAE Runner ○GAETestBase UnitTest ○ ○
GAE Unit Runner ○ ○
GAE Testbed UnitTest ○ ○
非同期処理とテストと私
• 自己紹介
• 発表の流れ
• 今日いいたいこと
• 非同期処理
• 非同期処理とテスト
• 非同期処理とテストと私 ← いまここ
• まとめ
App Engineと非同期とテストと私
My products
GAE Deferred• TwistedのDeferredのようなもの• DeferredList• 並列実行されてる非同期処理が全て終了したら, キャッシュ更新とか.
• http://pypi.python.org/pypi/gaedeferred/
• http://blog.jbking.org/2011/01/gaedeferred-021.html
GAE Storyタイプ 開発
環境本番環境 非同期
NoseGAE Runner ○GAETestBase UnitTest ○ ○
GAE Unit Runner ○ ○
GAE Testbed UnitTest ○ ○
GAE Story Runner ○ ○ ○
タイプ 開発環境
本番環境 非同期
NoseGAE Runner ○GAETestBase UnitTest ○ ○
GAE Unit Runner ○ ○
GAE Testbed UnitTest ○ ○
GAE Story Runner ○ ○ ○
GAE Story
Under
designi
ng
まとめ
• 自己紹介
• 発表の流れ
• 今日いいたいこと
• 非同期処理
• 非同期処理とテスト
• 非同期処理とテストと私
• まとめ ← さいご!
... Use the Force for Hacking!
SeeAsynchronous processing everywhere.
It’s fun.
Thanks! :^)