gpt4 book ai didi

postgresql - 如何在 tokio_postgres 中使用自定义 Tokio 运行时(并且没有 tokio::main 宏)?

转载 作者:行者123 更新时间:2023-12-03 11:38:44 26 4
gpt4 key购买 nike

我将如何使用自定义 tokio 运行时构建器并且没有主宏来实现这个 tokio_postgres 示例?
这工作正常,根据 tokio_postgres docs :
示例/withmacro.rs

use tokio_postgres::{NoTls, Error};

async fn db_main()-> Result<(), Error> {

// pasted from: https://docs.rs/tokio-postgres/0.6.0/tokio_postgres/index.html

// Connect to the database.
let conn_string = std::env::var("PG_CONNECT").unwrap();
let (client, connection) = tokio_postgres::connect(&conn_string,NoTls).await?;

// The connection object performs the actual communication
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});

// Now we can execute a simple statement that just returns its parameter.
let rows = client
.query("SELECT $1::TEXT", &[&"hello world"])
.await?;

// And then check that we got back the same string we sent over.
let value: &str = rows[0].get(0);
println!("value: {:?}", &value);
assert_eq!(value, "hello world");

Ok(())
}

#[tokio::main]
async fn main() {
dotenv::dotenv().ok();
let _ = db_main().await;
}
但是,我想像下面的主要内容那样自定义 tokio 运行时构建器——而不是使用 tokio 宏。然而,当涉及到运行时的“tokio_postgres::connect”时,这会让人 panic 地说“没有反应器正在运行”。我应该如何重新配置​​以下代码以在 tokio_postgres 中使用我自己的 Tokio 运行时实例(假设这甚至是我需要的)?
示例/nomacro.rs
use tokio_postgres::{NoTls, Error};

async fn db_main()-> Result<(), Error> {
// Connect to the database.
let conn_string = std::env::var("PG_CONNECT").unwrap();

// This line panics with:
// "thread 'main' panicked at 'there is no reactor running, must be called from the context of Tokio runtime', /Users/me/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.3.2/src/io/driver/mod.rs:254:13"
let (client, connection) = tokio_postgres::connect(&conn_string, NoTls).await?;

// ...
Ok(())
}

fn main() {
dotenv::dotenv().ok();

// Tokio 0.3
let rt:Runtime = tokio::runtime::Builder::new_multi_thread()
.worker_threads(6)
.thread_name("my thread")
.build()
.unwrap();

rt.block_on( async {
db_main().await;
});
}
我是否应该将对运行时的引用传递给 db_main()给 tokio_postgres Config 的一个实例?我已经尝试使用 "tokio-postgres = { version = "0.6.0", default-features = false}" 禁用 tokio_postgres 中的 tokio 实例。在 Cargo.toml 中。
基线 Cargo.toml:
[dependencies]
dotenv = "0.15.0"
tokio = { version = "0.3", features = ["rt-multi-thread", "macros"] }
tokio-postgres = { version = "0.6.0"}
# tokio-postgres = { version = "0.6.0", default-features = false}

最佳答案

非常多的学习(rust、tokio、postgres),我被 this issue 提示至 enable_io() 我一时兴起尝试了一个可行的解决方案:

let rt = tokio::runtime::Builder::new_multi_thread()
.worker_threads(6)
.thread_name("my thread")
.enable_io()
.build()
.unwrap();
我很乐意听从东京那些更聪明的人的意见。这可能是一个不断发展的文档的案例。 panic 源于 here在东京。虽然直观 Postgres 需要“io”,但 Tokio Builder 的示例, tokio_postgres ,下面的代码并没有暗示需要 enable_io()在 Tokio_postgres 工作的 Tokio 构建器上。如果我不质疑这是一个完全错误的方法,我会提出一个文档拉取请求。
来自 tokio/src/io/driver/mod.rs
cfg_rt! {
impl Handle {
/// Returns a handle to the current reactor
///
/// # Panics
///
/// This function panics if there is no current reactor set and `rt` feature
/// flag is not enabled.
pub(super) fn current() -> Self {
crate::runtime::context::io_handle()
.expect("there is no reactor running, must be called from the context of Tokio runtime")
}
}
}

关于postgresql - 如何在 tokio_postgres 中使用自定义 Tokio 运行时(并且没有 tokio::main 宏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64658556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com