Salut à toutes et à tous,
Dans le cadre d'un projet web, version WSGI, j'ai besoin d'avoir une connexion à la base de données. Il en faudra une par thread, bien évidemment.
En soi, rien de très compliqué: threading.local et on est en route.
Le souci, c'est que threading.local ne semble pas être notifié lorsqu'un thread se termine, et ne permet donc pas aux objets d'être recyclés par le gc.
Dans mons cas, ça signifierait que les connexions à la db resteraient ouverte pendant toute l'exécution du programme. Ce n'est bien entendu pas acceptable.
Petit exemple de code pour rendre les choses un peu plus concrètes:
On peut voir qu'il n'y a pas de "Deleting", ni une seconde après, ni 3 jours après, puisqu'il reste une référence à l'objet dans le threadlocal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 >>> import threading >>> >>> local = threading.local() >>> class MyClass: ... def __init__(self): print("Init'ing") ... def __del__(self): print("Deleting") ... >>> def test(): ... local.obj = MyClass() ... >>> threading.Thread(target=test).start() Init'ing
Sachant que:
1. je n'ai pas la main sur la création des threads,
2. l'usage des weakref dans ce cas-ci n'est pas une possibilité,
comment puis-je m'assurer que les objets seront détruits une fois que le thread se termine ?
Partager