gpt4 book ai didi

rust - 如何将任务添加到在另一个线程上运行的 Tokio 事件循环?

转载 作者:行者123 更新时间:2023-11-29 08:07:14 31 4
gpt4 key购买 nike

I'd like to在 Rocket 服务器旁边启动 Tokio 事件循环,然后稍后将事件添加到此循环。我读了Is there a way to launch a tokio::Delay on a new thread to allow the main loop to continue? , 但我仍然不清楚如何实现我的目标。

最佳答案

作为the documentation states :

The returned handle can be used to spawn tasks that run on this runtime, and can be cloned to allow moving the Handle to other threads.

这是一个在一个线程中启动事件循环并让第二个线程在其上生成任务的示例。

use futures::future; // 0.3.5
use std::{thread, time::Duration};
use tokio::{runtime::Runtime, time}; // 0.2.21

fn main() {
let (shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel();
let (handle_tx, handle_rx) = std::sync::mpsc::channel();

let tokio_thread = thread::spawn(move || {
let mut runtime = Runtime::new().expect("Unable to create the runtime");

eprintln!("Runtime created");

// Give a handle to the runtime to another thread.
handle_tx
.send(runtime.handle().clone())
.expect("Unable to give runtime handle to another thread");

// Continue running until notified to shutdown
runtime.block_on(async {
shutdown_rx.await.expect("Error on the shutdown channel");
});

eprintln!("Runtime finished");
});

let another_thread = thread::spawn(move || {
let handle = handle_rx
.recv()
.expect("Could not get a handle to the other thread's runtime");

eprintln!("Another thread created");

let task_handles: Vec<_> = (0..10)
.map(|value| {
// Run this future in the other thread's runtime
handle.spawn(async move {
eprintln!("Starting task for value {}", value);
time::delay_for(Duration::from_secs(2)).await;
eprintln!("Finishing task for value {}", value);
})
})
.collect();

// Finish all pending tasks
handle.block_on(async move {
future::join_all(task_handles).await;
});

eprintln!("Another thread finished");
});

another_thread.join().expect("Another thread panicked");

shutdown_tx
.send(())
.expect("Unable to shutdown runtime thread");

tokio_thread.join().expect("Tokio thread panicked");
}
Runtime created
Another thread created
Starting task for value 0
Starting task for value 1
Starting task for value 2
Starting task for value 3
Starting task for value 4
Starting task for value 5
Starting task for value 6
Starting task for value 7
Starting task for value 8
Starting task for value 9
Finishing task for value 0
Finishing task for value 5
Finishing task for value 4
Finishing task for value 3
Finishing task for value 9
Finishing task for value 2
Finishing task for value 1
Finishing task for value 7
Finishing task for value 8
Finishing task for value 6
Another thread finished
Runtime finished

solution for Tokio 0.1 is available in the revision history of this post .

另见:

关于rust - 如何将任务添加到在另一个线程上运行的 Tokio 事件循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54612970/

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