在actix线程中执行同步的http客户端获取

4

我有一个actix端点,需要进行同步的http客户端获取来获得一些结果,并返回一些数据。我的端点不能使用async,因此我不能使用任何.await方法。

我尝试在端点中使用reqwests阻塞客户端,如下所示:

{ ...

  let res = reqwest::blocking::get(&fetch_url)?
    .json::<MyResp>()?;
  ...

但是它给我报错了:
thread 'main' panicked at 'Cannot start a runtime from within a runtime. This happens because a function (like `block_on`) attempted to block the current thread while the thread is being used to drive asynchronous tasks.', /.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.9/src/runtime/enter.rs:19:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

1
为什么你的端点不能使用异步? - undefined
长话短说,这是一个极其复杂的WebSocket服务器,使用了traits、WSSessionHandlers和Streamhandlers,并且只允许在顶部使用异步操作。 - undefined
3个回答

2

你应该尝试为此创建一个新线程:

std::thread::spawn(move || {

    reqwest::blocking::get(&url).unwrap().json().unwrap()

}).join().unwrap()

0

我搞不清楚如何在reqwest中使其正常工作(它可能与actix有一些奇怪的冲突),但出于某种原因,使用chttp却可以正常工作。

chttp::get(&fetch_url)?.text()?;


3
它在旧版本的Reqwest上运行正常,但是更新的版本将阻塞客户端与非阻塞客户端包装在tokio::block_on中。Actix也使用tokio,而tokio不支持嵌套运行时。 - undefined

-1

async函数中,你不能使用阻塞函数。

而是应该使用reqwest::get().await代替reqwest::blocking::get()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接