我正在编写一个WebSocket服务器,其中一个Web客户端连接到多线程计算机AI上下棋.WebSocket服务器想要将Logger对象传递给AI代码.该Logger对象将管理从AI到Web客户端的日志行.在Logger必须包含对客户端连接的参考.
我对生命周期如何与线程交互感到困惑.我用Wrapper类型参数化的结构重现了这个问题.该run_thread函数尝试解包该值并记录它.
use std::fmt::Debug;
use std::thread;
struct Wrapper<T: Debug> {
val: T,
}
fn run_thread<T: Debug>(wrapper: Wrapper<T>) {
let thr = thread::spawn(move || {
println!("{:?}", wrapper.val);
});
thr.join();
}
fn main() {
run_thread(Wrapper::<i32> { val: -1 });
}
Run Code Online (Sandbox Code Playgroud)
该wrapper参数存在于堆栈中,并且它的生命周期不会延伸超过run_thread堆栈帧,即使该线程将在堆栈帧结束之前连接.我可以从堆栈中复制值:
use std::fmt::Debug;
use std::thread;
struct Wrapper<T: Debug + Send> {
val: T,
}
fn run_thread<T: Debug + Send + 'static>(wrapper: Wrapper<T>) {
let thr = thread::spawn(move || …Run Code Online (Sandbox Code Playgroud) 给定一个Futures的集合,比如说 a Vec<impl Future<..>>,我怎样才能同时阻塞和运行所有的Futures 直到第一个Future准备好?
我能找到的最接近的功能是select 宏(也可以在 Tokio 中使用)。不幸的是,它只适用于明确数量的Futures,而不是处理它们的集合。
Javascript 中有一个与此功能等效的功能,称为Promise.race。有没有办法在 Rust 中做到这一点?
或者也许有一种方法可以使用另一种模式(也许是通道)来实现此用例?