【问题标题】:Load state asynchronously in Rocket or Tauri在 Rocket 或 Tauri 中异步加载状态
【发布时间】:2023-01-14 18:28:55
【问题描述】:

我有一个用 tauri(用于独立应用程序)和 rocket(用于网络版本)编写的应用程序。

该应用程序使用保存在内存中(基本上是内存数据库)的大型(-ish)文件,加载时间介于 1-10 秒之间,但我不希望该应用程序在打开之前阻塞该持续时间。

我的代码(火箭部分)目前看起来像这样:

#[rocket::get("/api/search?<searchTerm>&<take>&<skip>")]
pub fn search<'a>(
    searchTerm: &str,
    take: Option<u32>,
    skip: Option<u32>,
    db: &rocket::State<Database>
) -> Json<SearchResult>
{
    Json(db.search(searchTerm, take, skip))
}

#[rocket::launch]
fn rocket() {
    // ...
    let db = Database::load().expect("Failed loading database");
    rocket::build()
        .mount("/", rocket::routes![search])
        .manage(db);
}

我怎样才能异步运行 Database::load() ,而不阻止 rocket server/tauri 应用程序的启动,并且仍然能够在 search 中获取它?

【问题讨论】:

  • 不,不幸的是,我认为 SharedFuture 根本没有按照我的想法去做。
  • 我删除了问题的那一部分,我认为它主要分散了我实际尝试做的事情的注意力
  • 不幸的是,在删除问题的那一部分时,您实际上删除了“问题”。您到底遇到了什么问题,遇到了什么错误? ;)
  • 数据库基本上是一个巨大的 .xml.gz 文件,同步加载和解析它会使启动时间过长。
  • 我的问题基本上是如何异步加载它,并且仍然将它注入我的端点

标签: rust rust-tokio rust-rocket tauri


【解决方案1】:

我最终使用了全局状态和这样的 RwLock:

static DB: RwLock::<Option<Database>> = RwLock::<Option<Database>>::new(None);

#[rocket::get("/api/search?<searchTerm>&<take>&<skip>")]
pub fn search<'a>(
    searchTerm: &str,
    take: Option<u32>,
    skip: Option<u32>,
    db: &rocket::State<Database>
) -> Json<SearchResult>
{
    if let Some(db) = DB.read().expect("Cannot read the database because it failed to load.").as_ref() {
        Json(jdict_shared::shared_api::search(db, searchTerm, take, skip))
    }
    else {
        // TODO: return proper error code
        Json(jdict_shared::shared_api::SearchResult::default())
    }
}

#[rocket::launch]
fn rocket() {
    // ...
    std::thread::spawn(|| {
        *DB.write().unwrap() = Some(Database::load(cfg.jdict));
    });

    rocket::build().mount("/", rocket::routes![search]);
}

这可行,但在我看来这是一个非常丑陋的解决方案。

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 2019-01-18
    • 2021-11-29
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2020-01-09
    相关资源
    最近更新 更多