websocket - Pysyft 客户端和服务器
问题描述
这个问题是关于我使用 pysyft 库进行联合学习的项目,但是那些具有 websockets 知识的人也可以提供帮助,因为 pysyft 使用 websockets 进行服务器和客户端交互。
首先,我有一个关于服务器和客户端交互的问题。我创建了一个仪表板来启动一个 pysyft 服务器和一个连接到上述服务器的 pysyft 客户端。但是,我有一个场景,我想让客户端不时与服务器断开连接(手动断开连接),以便更改模型参数。
我的解决方案是在 pysyft websocketClientWorker 上执行 close(),它调用 websocket 对象上的 shutdown() 函数。我认为这样做会关闭客户端和服务器之间的连接。在对模型参数进行任何更改之后。我将再次重新创建 pysyft websocketClientWorker 对象并重新执行模型训练。但是,我面临的问题是:websocket._exceptions.WebSocketConnectionClosedException:套接字已经关闭。在数据加载器的迭代期间抛出此异常(尽管成功连接到服务器)。
也许有更好的方法来处理这种情况,或者我错过了对 websockets 的某些基本理解。任何帮助将不胜感激。谢谢 :)
解决方案
经过几天对 pysyft 库的彻底检查后,我设法找到了问题的解决方案。事实证明,Websocket 连接和重新连接没有问题。显然,websocketclient 的超类(baseworker)包含一个工作注册表,它在 auto_add 变量设置为 True 时缓存 websocketclient 对象。此注册表由 websocketclient ID 索引,因此,如果 ID 相同,则不会在注册表中替换 websocketclient 对象的重新创建。因此,这解释了“套接字已关闭”问题,因为它引用了我已关闭的上一个 websocketclient 连接。remove_worker_from_local_worker_registry()
解决方案是在关闭其连接之前简单地调用 websocketclient 对象上的方法。
推荐阅读
- node.js - 使用 DynamoDB 批量更新插入
- java - JAXB 元素
初始化 - Java Spring Boot 2 - docker - 将 IAM 角色传递给 Terraform 的 Docker 容器
- c++ - 找不到 Boost(缺少:序列化)– cmake 错误
- javascript - 在子字符串中换行(JavaScript)
- amazon-web-services - 用于过滤的扫描与查询的 DynamoDB 成本(使用 GSI 哪个分区键与整个表相同)用于过滤
- shell - AIX 中的 cut 命令补充不起作用
- ios - Swift - 使用可解码将嵌套对象转换为对象数组
- fortran - 如何在 GDB 中打印可分配的 fortran int64 数组
- python - 如何编写 python 代码以通过 bash 脚本获取用户的输入