sqlite3モジュールのConnectionオブジェクトはスレッドセーフじゃない?
FUSEのバックエンドにsqliteを使ってみたら以下のようなエラーが出た。
Traceback (most recent call last): File "/usr/lib/python2.6/site-packages/fuse.py", line 361, in __call__ return apply(self.func, args, kw) File "sqlitefs.py", line 139, in getattr c=self.__conn.cursor() sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id -1208453440 and this is thread id -1224737936
マルチスレッドにした覚えがないのに呼び出しスレッドが異なっているのはFUSE側で何かしているからだとして、スレッドをまたいでConnectionオブジェクトが共有できないのは意外だった。
ということは何か、
conn = sqlite3.connect(":memory:")
とやって、この"conn"を共有することでスレッド間でのデータ共有出来るんじゃないかと思っていたのが、出来ないということか。":memory:"の使い道がキャッシュしか思い浮かばなくなった。プロセス間共有は無理でもスレッド間共有は出来ると思っていたのに。これならロックとか気にしなくてすむと思っていたのに。残念。