Rust 如何获得电弧的内容物

Rust 如何获得电弧的内容物,rust,rust-tokio,Rust,Rust Tokio,我有一个类,它包含一个TcpStream,TcpStream不一定存在,所以我最初使用了选项,但发现Arc使用线程安全性,而且由于我正在运行异步任务,这可能会导致一些线程问题。所以我结束了我的Arc,但是在获取数据时遇到了问题 #[derive(Debug, Clone)] enum ConnectionError { ConnectError(usize), SendError(usize), } #[derive(Debug, Clone)] struct Connecti

我有一个类,它包含一个
TcpStream
TcpStream
不一定存在,所以我最初使用了
选项
,但发现
Arc
使用线程安全性,而且由于我正在运行异步任务,这可能会导致一些线程问题。所以我结束了我的
Arc
,但是在获取数据时遇到了问题

#[derive(Debug, Clone)]
enum ConnectionError {
    ConnectError(usize),
    SendError(usize),
}

#[derive(Debug, Clone)]
struct Connection {
    stream: Arc<TcpStream>,
    loc: usize,
}

impl Connection {
    async fn connect(loc:usize) -> Result<Connection, ConnectionError> {
        println!("Connecting");
        
        let stream = TcpStream::connect("3.77.107.247:86").await.map_err(|_| ConnectionError::ConnectError(loc))?;
        //stream.write_all(b"Hello World\n").await;

        Ok( Connection2 {
            stream: Arc::new(stream),
            loc: loc,
            }
        )
    }
    async fn Send(mut connection: Connection, string: String) -> Result<Connection2, ConnectionError> {
        println!("Count: {},", Arc::weak_count(&connection.stream));
        if let Some(x) = Arc::get_mut(&mut connection.stream) {
            x.write_all(b"HELLO").await.map_err(|_| ConnectionError::SendError(connection.loc))?;
        }
        else {
            println!("Unable to send message");
        }
        Ok( connection )
    }
}
#[派生(调试、克隆)]
枚举连接错误{
连接错误(usize),
发送错误(usize),
}
#[派生(调试、克隆)]
结构连接{
溪流:弧形,
loc:usize,
}
impl连接{
异步fn连接(loc:usize)->结果{
println!(“连接”);
让stream=TcpStream::connect(“3.77.107.247:86”)。wait.map_err(| | ConnectionError::ConnectError(loc))?;
//stream.write_all(b“Hello World”)。等待;
Ok(连接2{
流:弧::新(流),
loc:loc,
}
)
}
异步fn发送(mut连接:连接,字符串:字符串)->结果{
println!(“计数:{},”,弧::弱计数(&connection.stream));
if let Some(x)=Arc::get_mut(&mut connection.stream){
x、 写所有(b“你好”).wait.map_err(| | ConnectionError::senderError(connection.loc))?;
}
否则{
println!(“无法发送消息”);
}
Ok(连接)
}
}
我总是以意外的结果结束:

无法发送消息 线程“tokio runtime worker”在一个
None
value”上被调用
Option::unwrap()
时惊慌失措,src\main.rs:292:58 注意:使用
RUST\u BACKTRACE=1运行环境变量以显示回溯

这向我表明我的
Arc
get\u mut为空

我已打印出如图所示的
弱计数
,但输出为0

有什么指导吗

我有一个包含TcpStream的类-TcpStream不一定存在-所以我最初使用了选项,但发现Arc使用线程安全性-并且由于我正在运行异步任务-这可能会导致一些线程问题。所以我结束了我的Arc,但在获取数据时遇到了问题

#[derive(Debug, Clone)]
enum ConnectionError {
    ConnectError(usize),
    SendError(usize),
}

#[derive(Debug, Clone)]
struct Connection {
    stream: Arc<TcpStream>,
    loc: usize,
}

impl Connection {
    async fn connect(loc:usize) -> Result<Connection, ConnectionError> {
        println!("Connecting");
        
        let stream = TcpStream::connect("3.77.107.247:86").await.map_err(|_| ConnectionError::ConnectError(loc))?;
        //stream.write_all(b"Hello World\n").await;

        Ok( Connection2 {
            stream: Arc::new(stream),
            loc: loc,
            }
        )
    }
    async fn Send(mut connection: Connection, string: String) -> Result<Connection2, ConnectionError> {
        println!("Count: {},", Arc::weak_count(&connection.stream));
        if let Some(x) = Arc::get_mut(&mut connection.stream) {
            x.write_all(b"HELLO").await.map_err(|_| ConnectionError::SendError(connection.loc))?;
        }
        else {
            println!("Unable to send message");
        }
        Ok( connection )
    }
}
那是。。。可能是完全错误的解决方案?这两者甚至都不能互换,那么

我有一个类,它包含一个TcpStream-TcpStream不能保证存在

有点不见了?弧不能这样做,它总是包含一些东西

选项
是线程安全的,一次只能存在于一个线程中<代码>弧
是线程安全的,可以在线程之间共享。按照您的设计方式,您可以在不同的线程中拥有多个
连接
,共享相同的底层tcp流,这听起来是个糟糕的主意

此外,
Arc
不能直接变异(除非它的强计数为1,这里显然不是这种情况),相反,您需要使用某种线程安全的“内部可变性”容器,它可以从不可变的引用(通常是a或a)生成可变引用

在这里,我看不到
选项
的意义:

  • 在多个
    连接之间直接共享
    TcpStream
    听起来是个坏主意,某种类型的池或多路复用可能还可以,但我希望得到非常明确和有意的支持,而不仅仅是在管道中发送垃圾,希望它在另一端以可接受的状态出现,交错的信息听起来像是一种灾难

  • Arc
    不能为空,因此

    我有一个类,它包含一个TcpStream-TcpStream不能保证存在

    选择权的正当性毫无意义


注意:IP是公共的-上面没有任何内容-当我重置实例(AWS EC2实例)时,它会被更改:)不太关心,什么?我不知道你在问什么对不起,我想我一开始读错了。
get_mut()
如果有其他所有者,则会失败,由
strong_count()
确定。我想我当时误解了结构。。。我的目的是1)建立1.a)已连接或1.b)未连接的连接。如果1.b)未连接,则2.a)TCP流将为无,否则2.b)它将存在。因此,我创建了一个包含
TcpStream
的结构,该结构可能存在,但不能保证存在。每个连接只需要1个
TcpStream
。一般来说,我只希望有多个
TcpStream
s,它们都可以异步接收/发送消息。我认为我的
连接
永远不会是空的,但我连接中的
TcpStream
可能是空的。既然
不正确,为什么
选项
在这里会出错?或者更好的问题-保存我的
TcpStream
的最佳数据容器是什么?@impression7vx我只是说
选项
根据您在这里显示的代码没有任何意义,您将
选项
替换为
:一个
选项
的目的是保存一些东西或什么都不保存,但是
连接
函数的代码总是填充结构,因此,在我能看到的任何地方都没有
任何内容
,我看不到使用
选项的意义。显然,您可以创建一个未连接的连接,该连接必须作为后一点连接,但是。。。你为什么要这样做?我想我明白你的意思了——出于某种原因,我在想TcpStream可能会关闭,因此我需要检查TcpStream是否
None
,然后从那里联系起来。呃,我记得我为什么这么做——公平地说,我是个新手