You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:22:37