Ricardo, thanks! That is indeed the problem. Whether or not it is a misuse of the API, the API that I actually need (cleanly close only SOME dal/adapter instances and not ALL dal/adapter instances) does not currently exist, and I need to to reach into the underlying implementation to do what I want.
For massimo: something like the following might be useful (note: untested):
(added to ConnectionPool class)
def close_or_recycle(self, action):
""" to close cleanly in a multithreaded environment """
if self in thread.get(instances, []):
if action:
if callable(action):
action(self)
else:
getattr(self, action)()
# ## if you want pools, recycle this connection
really = True
if self.pool_size:
sql_locker.acquire()
pool = ConnectionPool.pools[self.uri]
if len(pool) < self.pool_size:
pool.append(self.connection)
really = False
sql_locker.release()
if really:
self.close()
if callable(action):
action(None)
return
and rewriting close_all_instances to use this while popping thread.instances on one hand, and having a DAL.close() method which calls self._adapter.close_or_recycle() (possibly also from DAL.__del__)
Thanks!