小编bru*_*uan的帖子

tokio 在 Rust 中加入多个任务

想象一下,一些 future 存储在一个Vec长度由运行时决定的 a 中,你应该同时加入这些 future,你应该怎么做?

显然,通过文档中的示例tokio::join,手动指定每个长度Vec可能是,如 1,2,3,... 并处理可观的案例应该工作。

extern crate tokio;

let v = Vec::new();
v.push(future_1);

// directly or indirectly you push many futures to the vector
 
v.push(future_N);

// to join these futures concurrently one possible way is 

if v.len() == 0 {}
if v.len() == 1 { join!(v.pop()); }
if v.len() == 2 { join!(v.pop(), v.pop() ); }
// ...
Run Code Online (Sandbox Code Playgroud)

我还注意到 tokio::join! 当我使用类似的语法时,将列表作为文档中的参数

tokio::join!(v);
Run Code Online (Sandbox Code Playgroud)

或类似的东西

tokio::join![ v ] /  tokio::join![ v[..] ] …
Run Code Online (Sandbox Code Playgroud)

rust rust-tokio tokio

4
推荐指数
3
解决办法
4587
查看次数

使用 Box 对结构实施反序列化

包含 Box 作为成员变量的结构:

type Item = dyn Fn() -> Result<(), Box<dyn std::error::Error + Send + Sync>>;
struct Inner {
    pub data: Box<Item>,
}

// a function, like the type: Item
fn parse() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    println!("parse called");
    Ok(())
}
Run Code Online (Sandbox Code Playgroud)

Inner现在出现了自定义实现结构体反序列化的问题:

let s = r#"{"data": "parse"}"#;
Run Code Online (Sandbox Code Playgroud)

进入结构体内部:

{
    data: Box::new(parse)
}
Run Code Online (Sandbox Code Playgroud)

我知道serde不要实现 deserialize for ,并且必须手动实现 Deserialize ,这是我的代码,遵循docmentaionBox<T>给出的示例:

let s = r#"{"data": "parse"}"#;
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这些代码时,出现错误:

{
    data: Box::new(parse)
}
Run Code Online (Sandbox Code Playgroud)

粗略地说,我猜问题出在(***) …

rust deserialization serde serde-json

3
推荐指数
1
解决办法
2176
查看次数

标签 统计

rust ×2

deserialization ×1

rust-tokio ×1

serde ×1

serde-json ×1

tokio ×1