昨日のPyCon APAC 2013 1日目に行ってきた(1) #pyconapac
に行ってきた、の続き。
Interrupt-Driven programming
スライドはまだ上がっていないっぽいんだけど、だいたいこれ
と同じだと思われる。SIGALRMによるタイムアウトのハンドリングはPythonだけではなく一般的なUnixであればどの言語でも使えるのでよい手法だなーと思った。それを使いやすくしたのがinterruptingcow
でこれは便利そうだと思った。全体的には英語+喋るスピードが速くてほとんど聞き取れなかったけど、スライドの内容はだいたい理解できたと思う。
はじめに
- bitbucketはDjango
- githubbitbucketのAPIのレスポンス時間が比較された
- レスポンスタイムでaverageは見るな
- slow requests have a big impact
- ユーザをいらつかせる
- APIクライアントを壊す(timeout)
- Rants on Twitter
- foncus on the remining 2% instead.
logging timeouts
タイムアウトをログに記録する。
コードのイメージ
def handler(*args):
raise Excepiton("Request timed out")
signal.signal(signal.SIGALRM, handler)
signal.setitimer(signal.ITIMER_REAL, 28)
try:
アプリケーションの処理
finally:
signal.setitimer(signal.ITIMER_REAL, 0)
→Tracebackが得られる!あとは遅いところをひたすら治す
- legacy/bad code often resists refactoring
- Unpredictable input
interruptingcow
https://pypi.python.org/pypi/interruptingcow
さっきのSIGALRMのあれをモジュールにして使いやすくしたもの。
from interruptingcow import timeout
with timeout(2, RuntimeError):
なんか処理
みたいに書ける。
Scalable content linkification の例
def prelace(doc, pattern, tmpl):
try:
replace処理
exception TimeoutExcepiton:
pass
return doc
with timeout(.1, TimeoutException):
print replace(doc, re.compile, '<a href="">sss</a>')
django-timelimit
これもこの人が作っているモジュール。詳細は調べきれてない。
Unique Aspects
- works with legacy code
- Generic solution to different problems
- Optimistic approach (EAFP vs LBYL)
まとめ
- Page render times highly dependent on runtime factors
- Page timeouts have a disproportinally large impact
- Refactor, pre-compute, paginate, remove funcionality, etc
- Time-box expensive code with cheap fallback
- interruptingcow - time-box arbitrary Python code
- django-timelimit - time-box Django template fragments
- the average color of the universe isCosmic Latte
Fabric for fun and profit
Fabricはちょっと前にFabricの豆知識
で書いたようにちょっと触ってたのでわりと復習的な感じだった。
はじめに
- We script everything
- We ssh in and out servers all the time
- FabricはPythonでsshでやっていたことを効率よくするためのツール
Fabricの簡単な説明
- fabfile.py
- @task
- $ fab hello
Environment configuration
@task
def production();
env.user = 'pdfs'
env.hosts = [ 'example.com' ]
it is just python. we can mix python codes into system commands
Vagrant development
$ fab vargrant -- sudo service couchdb restart
Fabricの代替
How the Mock library helps me developing client-side applications
MockというPython3.3から標準に含まれるようになったモックライブラリの説明と、外部のWebAPI呼び出しにおける使い方の説明。Mockって1回使ってみたんだけど個人的には微妙で(でもなんで微妙だったか思い出せない)、個人的にはpy.test
のmonkeypatchより複雑なことをしたいときはFlexMock
というものを使っている。3.3から標準添付されたので今後はやっぱりこっちを使ってみようかな。
- @clsung さん from Taiwan
- 仕事はフリーランス
はじめに
- モックライブラリはmock以外にMox, Flexmockがある
- mock はPython 3.3から標準ライブラリになった
Mockの特徴
- Mock()
- MagickMock()
- @patch decorator
How mock helps me
- Develop/test client-side applications
- Server-side APIs (Google Drive v2)
- Client-side request library (requests)
とかとか。
Mock open() - StringIO
with patch('__builtin__.open') as m:
m.return_value = ...
patch.object(requests, 'requests', autospec=True).start()
patch('gdapi.utils.retry', lambda: x, y)
その他テストで使える有用なライブラリ
- factory_boy
- httpretty
- testfixtures