J'ai un système distribué Pyro4 avec plusieurs clients se connectant à un seul serveur. Ces clients se connectent à un objet distant, et cet objet peut allouer certaines ressources dans le système (des périphériques virtuels, dans mon cas).
Lorsqu'un client se déconnecte (disons à cause d'une panne), je dois libérer ces ressources. Quelle est la bonne façon de détecter qu'un client spécifique s'est déconnecté d'un objet spécifique ?
J'ai essayé différentes choses :
- Remplacer le
Daemon.clientDisconnected
méthode. J'obtiens unconnection
de cette méthode. Mais je ne peux pas le corréler à un objet, car je n'ai pas accès à l'objet distant auquel cette connexion fait référence. - Utilisation de
Pyro4.current_context
enDaemon.clientDisconnected
. Cela ne fonctionne pas car il s'agit d'un objet local au thread. Cela en place, si j'ai plus de clients connectés que de threads dans mon pool, j'obtiens des contextes répétés. - Utilisation de
Proxy._pyroAnnotations
comme dans l'exemple "usersession" disponible par le projet Pyro4, ne m'aide pas, parce qu'encore une fois, j'obtiens l'annotation à partir de la balisePyro4.core.current_context.annotations
qui me montre des annotations erronées lorsqueDaemon.clientDisconnected
est appelé (j'imagine que cela est dû à des problèmes liés à un fil). - Utilisation de
instance_mode="session"
et le__del__
dans la classe distante (chaque client ayant une instance distincte de la classe, l'instance est censée être détruite lorsque le client se déconnecte). Mais cela repose sur la méthode__del__
qui présente certains problèmes, comme le font remarquer certains programmeurs Python.
J'ai ajouté ma solution actuelle comme réponse, mais j'aimerais vraiment savoir s'il existe une manière plus élégante de faire cela avec Pyro4, car ce scénario est récurrent dans la programmation de réseaux.