问题
I have an actix endpoint, and I need to do a synchronous http client fetch to get some results, and return some data. My endpoints cannot use async
, so I can't use any .await
methods.
I've tried using reqwests blocking client in my endpoint like so:
{ ...
let res = reqwest::blocking::get(&fetch_url)?
.json::<MyResp>()?;
...
But it gives me the error:
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:
I couldn't figure out how to get it working with reqwest
(it must have some weird conflicts with actix), but for some reason it worked fine with chttp
.
chttp::get(&fetch_url)?.text()?;
回答2:
You cannot use blocking functions inside async
functions.
Instead of reqwest::blocking::get()
use reqwest::get().await
.
回答3:
you should try creating a new thread for that:
std::thread::spawn(move || {
reqwest::blocking::get(&url).unwrap().json().unwrap()
}).join().unwrap()
来源:https://stackoverflow.com/questions/60580769/do-a-synchronous-http-client-fetch-within-an-actix-thread