1
votes

Effectuer une récupération de client http synchrone dans un thread actix

J'ai un point de terminaison actix, et je dois faire une extraction de client http synchrone pour obtenir des résultats et renvoyer des données. Mes points de terminaison ne peuvent pas utiliser async , je ne peux donc utiliser aucune méthode .await .

J'ai essayé d'utiliser le client de blocage de reqwests dans mon point de terminaison comme ceci:

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.

Mais cela me donne l'erreur:

{ ...

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


2 commentaires

Pourquoi vos points de terminaison ne peuvent-ils pas utiliser async?


Longue histoire, mais c'est un serveur websocket extrêmement compliqué utilisant des traits, WSSessionHandlers et Streamhandlers, avec uniquement l'async autorisé en haut.


3 Réponses :


0
votes

Je ne savais pas comment le faire fonctionner avec reqwest (il doit y avoir des conflits étranges avec actix), mais pour une raison quelconque, cela fonctionnait bien avec chttp .

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


1 commentaires

Cela fonctionnait avec une ancienne version de Reqwest, mais une version plus récente rendait le client bloquant le même que le non bloquant mais enveloppé avec un tokio::block_on . Actix utilise également tokio, qui ne prend pas en charge les environnements d'exécution imbriqués.



0
votes

Vous ne pouvez pas utiliser de fonctions de blocage dans les fonctions async .

Au lieu de reqwest::blocking::get() utilisez reqwest::get().await .


0 commentaires

0
votes

vous devriez essayer de créer un nouveau fil pour cela:

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

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

}).join().unwrap()


0 commentaires