ページ

2010年5月7日

geventのthread local

geventというよりはgreenletのお話です。greenletってマルチスレッドっぽく動いても基本はシングルスレッドじゃん。じゃあ、thread localってどうなのよ?と言うことで動かしてみました。
順をおって冗長に。

まず、何も考えないでthread localを使ったコードです。まあ、あとの方も何も考えないのですが、そこは気にしません。

from gevent import monkey, __version__
import gevent
monkey.patch_all()

import threading

print "gevent version", __version__

localdata = threading.local()
localdata.x = "hello, hope you can't see this"
def func():
print "func's view of localdata.__dict__:", localdata.__dict__

jobs = [gevent.spawn(func)]
gevent.joinall(jobs)


threding.local()でthread localなオブジェクトを作って、funcをスレッド的なもので動かしています。偉大なるサルmonkeyによってpythonにパッチが当てられるので、ちゃんと動いていくれそうな気分にさせてくれます。
実際に動かすと、
gevent version 0.12.2
func's view of localdata.__dict__: {'x': "hello, hope you can't see this"}
のように表示されます。簡単に言うと、thread localは使えません。Issue24で同じ問題に悩んだ賢人がいます。
次のように偉大なるサルmonkeyのパッチだけでは飽きたらず、自前でおまじないを唱えないといけないそうです。ちなみに、Pythonの本体にもうんたらかんたらと先ほどのレポートには書いています。


import threading
import thread
threading.local = thread._local


で、これで、ちゃんとうごいて、funcの中のlocaldataの中身は空になります。thread localが動いた。めでたしめでたし。

そういえば、djangoをgevent上で動かしてロングポーリングやってるぜ!ってどっかで見た。

0 件のコメント: