rust - 调用 tokio::spawn 时如何解决“特征绑定 `[closure]: tokio::prelude::Future` 不满足”?
问题描述
extern crate tokio; // 0.1.22
use tokio::io;
use tokio::net::TcpListener;
use tokio::prelude::*;
use bytes::Bytes; // 0.4.12
fn main() {
let addr = "0.0.0.0:1502".parse().unwrap();
let mut listener = TcpListener::bind(&addr).unwrap();
let done = listener
.incoming()
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
.for_each(move |socket| {
let process = move || {};
tokio::spawn(process)
});
tokio::run(done);
Ok(());
tokio::run(done);
}
error[E0277]: the trait bound `[closure@src/main.rs:17:27: 17:37]: tokio::prelude::Future` is not satisfied
--> src/main.rs:19:13
|
19 | tokio::spawn(process)
| ^^^^^^^^^^^^ the trait `tokio::prelude::Future` is not implemented for `[closure@src/main.rs:17:27: 17:37]`
|
= note: required by `tokio::spawn`
(游乐场)
解决方案
请检查 的定义tokio::spawn
:
pub fn spawn<F>(f: F) -> Spawn
where
F: Future<Item = (), Error = ()> + 'static + Send
它期望一个实现Future
作为它的参数。您传入的闭包tokio::spawn
不是Future
. Futures-rs 没有关闭,而是lazy
创建一个新的未来,最终将与提供的闭包创建的相同。
简单地说,lazy
future 持有一个要执行的闭包。这发生在执行器第一次执行时poll
(在这种情况下,您使用的是 Tokio 执行器)。
如果你用 包裹你的闭包lazy
,你的代码会像你预期的那样工作。
extern crate tokio; // 0.1.22
use tokio::net::TcpListener;
use tokio::prelude::*;
fn main() {
let addr = "0.0.0.0:1502".parse().unwrap();
let listener = TcpListener::bind(&addr).unwrap();
let done = listener
.incoming()
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
.for_each(move |_socket| {
let process = futures::future::lazy(move || {
println!("My closure executed at future");
Ok(())
});
tokio::spawn(process)
});
tokio::run(done);
}
推荐阅读
- android - 无法使用 Google Play 游戏服务登录
- python - 如何通过条件表达式覆盖系列值?
- django - 如何让 Django 表单同时验证多个字段
- cron - Cron 最后一次执行是在晚上 7 点
- haskell - 如何使用 cabal new-test 流式传输测试结果?
- swift - 创建对象时的 ViewController 类
- arrays - 如何将二维数组转换为集合 laravel?
- azure-functions - 将 Azure 持久函数用于 ETL 过程
- esper - 如何在 Esper 中正确创建阈值警报语句
- python - 用于自定义服务器 python 的 asyncio vs asyncore