-
Notifications
You must be signed in to change notification settings - Fork 32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
希望 NamingService
和 ConfigService
trait 提供基于Vec<u8>
类型的序列化/反序列化函数
#219
Comments
哈哈,还是我。
建议还是以上这种方案,毕竟较为通用,我今天看了下 pyo3-asyncio 的 examples 也暂时不知道怎么搞,不过我觉得可以参考博客 nacos-sdk-rust binding for Python 所关联的 为 Databend Rust Driver 实现 Python Binding,其做的 bindings/python 有引入 pyo3-asyncio
这个是不会改动的哈,如果想尝试可以自己 fork 独立的代码,然后 nacos-sdk-rust-binding-py 自行指定 |
或者希望各位解答这个问题: 如果我在Python中的多个进程里,每个进程初始化独立的 (提示:PyO3会在每次初始化时调用这么一大段代码,注意里面会调用 let naming_service_builder = if is_enable_auth {
nacos_sdk::api::naming::NamingServiceBuilder::new(props).enable_auth_plugin_http()
} else {
nacos_sdk::api::naming::NamingServiceBuilder::new(props)
};
let naming_service = naming_service_builder
.build()
.map_err(|nacos_err| PyRuntimeError::new_err(format!("{:?}", &nacos_err)))?; 参见上文,我看它引用本
是不是就没有我担心的问题了?那这样的话,我继续用多进程方案也是没有问题的。 |
Rust 的 trait 限定是有点长 😂 |
尝试过了,主要是这个方案我能力确实有限做不到,要是有能力,我急用肯定弄出来了。。要不花自己周末时间倒腾呢,实在不好意思,打扰你了。 |
尝试下模仿它 bindings/python ? 我之前也是模仿来实现的,之前也不太懂 Python。 |
要不。。方便回答下上面那个问题吗,没问题的话不实现也能用。😭 |
一般大部分情况下,应用下仅需一个 NamingService 作为客户端,而且需要长期持有直至应用停止。 因为它内部会初始化与服务端的长链接,后续的数据交互及服务变更等订阅,都是实时地通过长链接告知客户端的。 |
感谢解答,因为看到每次new都会调 |
@boholder 你说的是这种实现方式吗? 我也不是很懂 py |
@onewe 更新:可以用Python异步形式调用 |
感谢各位提供这个优秀的rust库!
下面我来解释一下,为什么我希望的改动必须在本项目中实现。
是这样的,我在使用
nacos-sdk-rust-binding-py
这个利用PyO3实现的库(只用命名,不用配置)。我需要以Python异步的形式使用它,目前
nacos-sdk-rust-binding-py
库只提供了同步使用的方式。为了实现我的目的,有两个实现思路:
一是用
pyo3-asyncio
库,把对本nacos-sdk
库的异步调用包装成Python的异步方法。这个因为个人能力不足,实验了下没能实现,实在不好意思。
二是用Python的
multiprocessing
库包装一下对nacos-sdk-rust-binding-py
库的调用。我是这样调用的:
此时,Python
multiprocessing
库要求NacosNamingClient
和NacosServiceInstance
是可序列化的。opc-source/nacos-sdk-rust-binding-py#2
还好PyO3的issue里有相关解决方案和示例,是需要在
nacos-sdk-rust-binding-py
的rust代码上动手。核心思路是要实现struct与
Vec<u8>
间的序列化反序列化,issue里的示例是用serde
库实现的。我照葫芦画瓢实现了
nacos-sdk-rust-binding-py
库里三个...Data Object的序列化反序列化。这三个struct都是在
nacos-sdk-rust-binding-py
库中定义的,字段都是普普通通的Option
,String
,bool
啥的,serde
库已经实现了对这些类型的操作,直接用就行:剩下两个Client strust:
好,终于到重点了。
目前咱们这个
nacos-sdk
库,只暴露了ConfigService
和NamingService
这两个trait,没把底层的struct暴露出来(这个实现没毛病,毕竟同时提供了同步和异步调用且必须在Cargo.toml
里二选一引入):因此如上文所示,
nacos-sdk-rust-binding-py
库是用dyn nacos_sdk::api::naming::NamingService
这种形式引用的。我想实现对两个Client的序列化反序列化,首先
serde
库会抱怨说,哎呀我不知道怎么处理这个Arc<dyn nacos_sdk::api::naming::NamingService + Send + Sync + 'static>
类型。抱怨的对,那就手动实现,但是这个
NamingService
是在nacos-sdk
库定义的,我没办法直接写impl Serialize, Deserialize NamingService: ...
。还好
serde
库提供了实现非本crate中定义的结构的方式,我就试着写了。再build,
serde
库抱怨说:我心想这下完了,只能在本
nacos-sdk
库中实现了。说了这么一大串,感谢耐心看到这里。
我看命名和配置两个Client的field类型还怪复杂的,不知道序列化反序列化好不好实现。
工作上急用,我们用的是Nacos 2.x,要让Python服务正常和Nacos交互。。。
周末打扰各位实在不好意思。
The text was updated successfully, but these errors were encountered: