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

Reqwest Client::new在Iron多线程测试中出现挂起问题

解决Reqwest Client::new()挂起的问题

嘿,我碰到过类似的坑!你这个Client::new()挂起、后面代码完全不执行的情况,大概率是同步/异步运行时冲突搞的鬼——毕竟Iron是基于同步阻塞IO的框架,而Reqwest默认的Client依赖tokio异步运行时,俩玩意儿在同一个线程里跑很容易互相阻塞,导致Client初始化卡住。

下面给你几个靠谱的解决方案,按推荐程度排序:

1. 换用Reqwest的阻塞客户端

最简单的办法就是直接用Reqwest专门的阻塞客户端,完全适配同步场景。把你的代码改成:

let client = reqwest::blocking::Client::new();

这个客户端是纯同步实现的,不需要初始化异步事件循环,和Iron的运行模型完全兼容,大概率能直接解决挂起问题。

2. 把Iron服务器放到单独线程跑

如果你非要用异步版的Reqwest Client,那得把伪服务器单独开个后台线程,避免和爬虫的异步事件循环抢占资源。举个例子:

#[test]
fn test_main_loop() {
    // 启动Iron服务器,绑定端口
    let server = iron::Iron::new(|_req| {
        Ok(iron::Response::with((iron::status::Ok, "预设的测试响应")))
    }).http("127.0.0.1:3000").unwrap();
    
    // 把服务器放到后台线程运行
    std::thread::spawn(move || {
        server.wait();
    });

    // 现在放心调用你的_main_loop
    _main_loop("http://127.0.0.1:3000".to_string(), false);
}

这样服务器在后台单独跑,爬虫的Client初始化就不会被阻塞了。

3. 换用轻量的HTTP Mock库(更适合测试)

其实Iron用来做测试Mock有点太重了,推荐你试试mockito这类专门的HTTP Mock库——它不需要启动真实的服务器,直接拦截Reqwest的请求并返回预设响应,完全避免线程冲突的问题。示例代码大概是这样:

#[test]
fn test_main_loop() {
    // 配置一个Mock响应:拦截GET请求,返回200和测试内容
    let mock = mockito::mock("GET", "/")
        .with_status(200)
        .with_body("这是Mock的响应内容")
        .create();

    // 调用你的_main_loop,用mockito提供的测试地址
    _main_loop(mockito::server_url().to_string(), false);

    // 验证这个Mock确实被调用过(可选,但能确保测试逻辑正确)
    mock.assert();
}

这种方式不仅不会有Client挂起的问题,测试代码也更简洁,维护起来更省心。

最后补个小提醒:如果你的_main_loop本身是异步函数,那测试函数一定要用tokio::test宏包裹,确保异步运行时正确初始化,不然也可能导致Client初始化卡住哦!

内容的提问来源于stack exchange,提问作者thatlittlegit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:52:21