pani c с "thread" main "в панике" в данный момент не работает во время выполнения Tokio - PullRequest
4 голосов
/ 16 января 2020

Я использую пример кода на elasti c в поисковой записи блога об их новом ящике, и я не могу заставить его работать как задумано. Поток паникует с thread 'main' panicked at 'not currently running on the Tokio runtime.'.

Что такое среда выполнения Tokio, как ее настроить и почему я должен?

use futures::executor::block_on;

async elastic_search_example() -> Result<(), Box<dyn Error>> {
    let index_response = client
        .index(IndexParts::IndexId("tweets", "1"))
        .body(json!({
            "user": "kimchy",
            "post_date": "2009-11-15T00:00:00Z",
            "message": "Trying out Elasticsearch, so far so good?"
        }))
        .refresh(Refresh::WaitFor)
        .send()
        .await?;
    if !index_response.status_code().is_success() {
        panic!("indexing document failed")
    }
    let index_response = client
        .index(IndexParts::IndexId("tweets", "2"))
        .body(json!({
            "user": "forloop",
            "post_date": "2020-01-08T00:00:00Z",
            "message": "Indexing with the rust client, yeah!"
        }))
        .refresh(Refresh::WaitFor)
        .send()
        .await?;
    if !index_response.status_code().is_success() {
        panic!("indexing document failed")
    }
}

fn main() {
    block_on(elastic_search_example());
}

Ответы [ 2 ]

6 голосов
/ 16 января 2020

Похоже, что ящик Elasticsearch использует Tokio для внутреннего использования, поэтому вы должны также использовать его, чтобы соответствовать их предположениям.

Поиск функции block_on в их документации, у меня есть это . Таким образом, кажется, что ваш main должен выглядеть следующим образом:

use tokio::runtime::Runtime;

fn main() {
    Runtime::new()
        .expect("Failed to create Tokio runtime")
        .block_on(elastic_search_example());
}

Или вы можете заставить main функционировать как asyn c с макросом атрибута , который будет сгенерируйте создание во время выполнения и block_on вызов для вас:

#[tokio::main]
async fn main() {
    elastic_search_example().await;
}
0 голосов
/ 25 марта 2020

У меня была такая же ошибка, когда я использовал tokio::run (из версии tokio = 0.1) с корзиной, в которой внутренне используется tokio02 (версия tokio = 0.2) (в моем случае это был reqwest). Сначала я просто изменил std::future::Future на futures01::future::Future с futures03::compat. Чтобы это скомпилировать. После запуска я получаю именно вашу ошибку.

Решение:

Добавление tokio-compat решило мою проблему.


Подробнее о Токио Compat

...