1

这个问题是关于我使用 pysyft 库进行联合学习的项目,但是那些具有 websockets 知识的人也可以提供帮助,因为 pysyft 使用 websockets 进行服务器和客户端交互。

首先,我有一个关于服务器和客户端交互的问题。我创建了一个仪表板来启动一个 pysyft 服务器和一个连接到上述服务器的 pysyft 客户端。但是,我有一个场景,我想让客户端不时与服务器断开连接(手动断开连接),以便更改模型参数。

我的解决方案是在 pysyft websocketClientWorker 上执行 close(),它调用 websocket 对象上的 shutdown() 函数。我认为这样做会关闭客户端和服务器之间的连接。在对模型参数进行任何更改之后。我将再次重新创建 pysyft websocketClientWorker 对象并重新执行模型训练。但是,我面临的问题是:websocket._exceptions.WebSocketConnectionClosedException:套接字已经关闭。在数据加载器的迭代期间抛出此异常(尽管成功连接到服务器)。

也许有更好的方法来处理这种情况,或者我错过了对 websockets 的某些基本理解。任何帮助将不胜感激。谢谢 :)

4

1 回答 1

1

经过几天对 pysyft 库的彻底检查后,我设法找到了问题的解决方案。事实证明,Websocket 连接和重新连接没有问题。显然,websocketclient 的超类(baseworker)包含一个工作注册表,它在 auto_add 变量设置为 True 时缓存 websocketclient 对象。此注册表由 websocketclient ID 索引,因此,如果 ID 相同,则不会在注册表中替换 websocketclient 对象的重新创建。因此,这解释了“套接字已关闭”问题,因为它引用了我已关闭的上一个 websocketclient 连接。remove_worker_from_local_worker_registry()解决方案是在关闭其连接之前简单地调用 websocketclient 对象上的方法。

于 2020-03-27T11:25:36.317 回答