我有一个 Pyro4 分布式系统,有多个客户端连接到单个服务器。这些客户端连接到一个远程对象,该对象可能会在系统中分配一些资源(在我的例子中是虚拟设备)。
一旦客户端断开连接(假设是因为崩溃),我需要释放这些资源。检测特定客户端已与特定对象断开连接的正确方法是什么?
我尝试了不同的东西:
- 覆盖
Daemon.clientDisconnected
方法。我connection
从这个方法中得到一个参数。但我无法将其与对象相关联,因为我无法访问该连接所指的远程对象。 - 使用
Pyro4.current_context
在Daemon.clientDisconnected
. 这不起作用,因为这是一个线程本地对象。这样,如果我连接的客户端多于池中的线程,我就会得到重复的上下文。 - 在 Pyro4 项目可用的“usersession”示例中使用
Proxy._pyroAnnotations
as 对我没有帮助,因为我再次从Pyro4.core.current_context.annotations
属性中获取注释,它在Daemon.clientDisconnected
调用时显示错误的注释(我想是由于线程相关问题)。 - 在远程类中使用
instance_mode="session"
和__del__
方法(因为每个客户端都有一个单独的类实例,因此一旦客户端断开连接,该实例就应该被销毁)。但这依赖于__del__
方法,正如一些 Python 程序员会指出的那样,该方法存在一些问题。
我添加了我当前的解决方案作为答案,但我真的很想知道 Pyro4 是否有更优雅的方法,因为这种情况是网络编程中的一种循环模式。