为啥这个示例铁代码似乎阻塞?

Posted

技术标签:

【中文标题】为啥这个示例铁代码似乎阻塞?【英文标题】:Why does this example iron code seem to block?为什么这个示例铁代码似乎阻塞? 【发布时间】:2015-11-03 06:28:32 【问题描述】:

我正在从http://ironframework.io 主页运行这个 hello world 示例代码:

extern crate iron;

use iron::prelude::*;
use iron::status;

fn main() 
    fn hello_world(_: &mut Request) -> IronResult<Response> 
        Ok(Response::with((status::Ok, "Hello World!")))
    

    Iron::new(hello_world).http("localhost:3000").unwrap();
    println!("On 3000");

我预计会在标准输出上看到“On 3000”,但它从未出现。我的猜测是主线程在执行 println 之前被阻塞了。为什么会这样?

如果我使用一个临时的并在之后调用 unwrap,我会得到预期的输出:

fn main() 
    fn hello_world(_: &mut Request) -> IronResult<Response> 
        Ok(Response::with((status::Ok, "Hello World!")))
    

    let result = Iron::new(hello_world).http("localhost:3000");
    println!("On 3000");
    result.unwrap();

为什么在返回值上调用 unwrap 时行为会发生变化?

我正在运行 Rust 1.1.0 和 Iron 0.1.20。

【问题讨论】:

【参考方案1】:

在我写完这个问题后,我想到了答案。

http 函数返回一个HttpResult&lt;Listening&gt; Listening 类型有一个析构函数,它在线程上调用 join,从而阻塞。

在第一种情况下,返回对象的生命周期在 unwrap 调用之后完成,因此调用了加入线程的析构函数。如果我将它分配给一个变量,则在调用 unwrap 之前不会调用析构函数。

【讨论】:

以上是关于为啥这个示例铁代码似乎阻塞?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 XMPPFramework 会阻塞?

为啥 pytz 似乎没有任何时区信息?

C++ 唯一指针;为啥这个示例代码会出现编译错误?错误代码太长了,我无法指定

为啥 pop to root 在这个示例代码 SwiftUI 中不起作用?

为啥代码覆盖率在 ReSharper 中不起作用?

为啥等待后的代码没有立即运行?它不应该是非阻塞的吗?