解决PyO3中#[pyclass]包含Rc结构体的线程安全报错问题
解决PyO3中含Rc结构体的#[pyclass]线程安全错误
问题原因
PyO3的#[pyclass]默认要求结构体实现Send trait(Python对象可能在多线程间传递),而std::rc::Rc<T>是单线程引用计数类型,不满足Send约束,因此触发E0277错误。
解决方案
方案1:替换Rc为Arc(推荐)
std::sync::Arc<T>是线程安全的引用计数类型,只要内部T实现Send(你的MyStruct满足该条件),Arc<T>就自动实现Send,完全符合PyO3的要求。修改后的代码:
use std::sync::Arc; struct MyStruct { name: String, } #[pyclass] struct PyMyStruct { ptr: Arc<MyStruct>, }
方案2:标记pyclass为不可跨线程(仅当必须保留Rc时使用)
如果业务逻辑必须依赖Rc,可以在#[pyclass]中添加unsendable参数,告知PyO3该结构体不需要实现Send。但注意:这样的Python对象不能跨线程传递,否则会引发运行时错误。修改后的代码:
struct MyStruct { name: String, } #[pyclass(unsendable)] struct PyMyStruct { ptr: std::rc::Rc<MyStruct>, }
内容的提问来源于stack exchange,提问作者Jiamiao Hao
相关产品推荐
相关产品推荐

