2019年4月13日土曜日

Threadごとにconnection

 マルチプロセスで並列化したのは、実はThreadごとにDBとのconnectionを張る方法がわからなかったからだ。単純にThreadの中で最初にmake-connectionしていたら落っこちた1
 そうか、*connection*は別空間にならないのか。
 でもどうやれば、いいんだろう。たぶんパッケージもThreadごとになるわけじゃないだろうし。そもそもThreadごとに変数をもてるのか?
 Emacsのバッファローカル変数のように。
 うーん、*connection*をクロージャー化すれば、いけるような気もするけれど、方向性を誤っているような予感がする。で、結局、そのあたりのあれやこれやが解決しないと、マルチスレッドでの並列化は無理だった。
 別にマルチプロセスで問題はないのだけど。
 いや問題はあるのか。ループでプロセスを四個ずつ立ち上げるようにしているので、途中で終了することができない。Ctrl-Cで中断するしかなく、なんか、これが気持ち悪い。
 ググってもわからず、悩んでいるとき、cl-dbiのソースをのぞいたらまさにそういうコードがあった。別に明確にサポートしているわけではなく、それ関係がエクスポートされているわけでもないのだけど、考え方は了解した。
 なるほど、ハッシュテーブルを用意してThread自身をキーにしてconnectionを管理すれば、いいのか。じゃ、こうか。

 *connection*を(conn)に変更すれば、OK——そのはず2

Footnotes:

1

selectしたときに。

2

cl-dbiとbordeaux-threadsを使用。BUGがあった。(conn)をthread safeにする必要があって対応した。