2014年2月5日水曜日

Google APIs Client Library for python の process-safe 性

Google APIs Client Library for python で OAuth2 のアクセストークンを保存する
Storage として file.Storage を使う場合、アクセストークンのリフレッシュ時に
生じる書き込みにおいて、複数プロセスに対するロックが不完全なような気がする。

oauth2client/file.py には以下のように定義されており、そのロックには threading.Lock
を使っている。

     36 class Storage(BaseStorage):
     37   """Store and retrieve a single credential to and from a file."""
     38
     39   def __init__(self, filename):
     40     self._filename = filename
     41     self._lock = threading.Lock()
これだと同じ Python プロセスの複数スレッドからのアクセスには耐えうるものの、
python プロセスを fork するようなプログラムでは排他出来ないのではないか?
Storage がファイルの場合はロックファイルや共有メモリを使うべきと思うのだが
どうだろう…
実際 mod_python を使ったプログラムに Credentials::authorize() が入っていたり
すると、同時アクセスがあった場合に何度も同時にリフレッシュがかかってしまう
動きをしていた。Prefork だからだろうか?

認識が違ってたら誰かツッコミください。

0 件のコメント:

コメントを投稿