- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个定义通用数据源的库,该数据源可以同步和异步地从各种来源提取数据。在构建异步部分时,我遇到了以下我不知道如何解决的编译问题:
这是我的简化代码(playground link)
extern crate futures; // futures = "0.1.24"
extern crate tokio; // tokio = "0.1.8"
extern crate serde_json;
use futures::Future;
use serde_json::Value;
use std::collections::HashMap;
trait DataSource {
type Data;
fn read_async(&self, Option<HashMap<String, Value>>) -> Box<futures::Future<Item=Option<Self::Data>, Error=String>>
where Self::Data: 'static + Send;
}
struct DataSourceImpl;
impl DataSource for DataSourceImpl {
type Data = Vec<String>;
fn read_async(&self, _params: Option<HashMap<String, Value>>) -> Box<futures::Future<Item=Option<Self::Data>, Error=String>>
where Self::Data: 'static + Send
{
Box::new(futures::future::ok(Some(vec!["some data".to_string()])))
}
}
fn main() {
let datasource = DataSourceImpl{};
let params = HashMap::new();
tokio::run(datasource.read_async(Some(params))
.map(|content| {
println!("Content read = {:?}", &content);
()
})
.map_err(|err| {
println!("Error {}", &err);
()
})
);
}
我得到以下编译错误:
error[E0277]: `dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>` cannot be sent between threads safely
--> src/main.rs:45:13
|
45 | runtime.spawn(future);
| ^^^^^ `dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>` cannot be sent between threads safely
|
= help: the trait `std::marker::Send` is not implemented for `dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>`
= note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique<dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>>`
= note: required because it appears within the type `std::boxed::Box<dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>>`
= note: required because it appears within the type `futures::Map<std::boxed::Box<dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>>, [closure@src/main.rs:34:14: 37:10]>`
= note: required because it appears within the type `futures::MapErr<futures::Map<std::boxed::Box<dyn futures::Future<Item=std::option::Option<std::vec::Vec<std::string::String>>, Error=std::string::String>>, [closure@src/main.rs:34:14: 37:10]>, [closure@src/main.rs:38:18: 41:10]>`
然而,在查看标准库时,我发现了以下实现:
impl<T: ?Sized> Send for Box<T> where T: Send
impl<T> Send for Option<T> where T: Send
impl<T> Send for Vec<T> where T: Send
impl Send for String
impl Send for [failure::]Error
我错过了什么?
如果我去掉这个特征并替换 Box<Future<...>>
通过 impl Future<...>
然后它起作用了(playground link for the new code);但我不明白这个特征有什么问题 & Box
实现...
extern crate failure;
extern crate futures; // futures = "0.1.24"
extern crate tokio; // tokio = "0.1.8"
extern crate serde_json;
use futures::Future;
use serde_json::Value;
use std::collections::HashMap;
fn read_async(_params: Option<HashMap<String, Value>>) -> impl futures::Future<Item=Option<Vec<String>>, Error=failure::Error> {
futures::future::ok(Some(vec!["some data".to_string()]))
}
fn main() {
let params = HashMap::new();
let future = read_async(Some(params))
.map(|content| {
println!("Content read = {:?}", &content);
()
})
.map_err(|err| {
println!("Error {}", &err);
()
});
tokio::run(future);
}
最佳答案
看起来我只需要将函数签名更改为
fn read_async(
&self,
_: Option<HashMap<String, Value>>,
) -> Box<Future<Item = Option<Self::Data>, Error = String> + Send> {
// ^^^^^^^
确实,Box<T>
应该是 Send
什么时候T
是Send
, 但我必须拼写出来因为 Future
不会手动/自动导出它。
感谢Tobz感谢您指出这一点。
关于rust - tokio::run() 和发送标记的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52539464/
当运行这样的代码时: use futures::executor; ... pub fn store_temporary_password(email: &str, password: &str) -
我遵循了mdns Rust文档并粘贴了示例代码,但它抛出了以下错误:。以下是我拥有的代码:。依赖关系:。我遗漏了什么?我试着在网上寻找,但没有找到如何为这个用例创建一个反应堆。
假设我想与 Tokio 同时下载两个网页... 要么我可以用 tokio::spawn() 来实现这个: async fn v1() { let t1 = tokio::spawn(reqwe
我制作了一个还能显示天气的 LED 时钟。我的程序在一个循环中做了几件不同的事情,每件事都有不同的间隔: 每 50 毫秒更新一次 LED, 每 1 秒检查一次光照水平(以调整亮度), 每 10 分钟获
我制作了一个还能显示天气的 LED 时钟。我的程序在一个循环中做了几件不同的事情,每件事都有不同的间隔: 每 50 毫秒更新一次 LED, 每 1 秒检查一次光照水平(以调整亮度), 每 10 分钟获
tokio::run_async + futures 0.3 + tokio::net::UnixStream panic 。 设置 [package] name = "prac" version =
在我的 rust 项目中,cargo 提示使用 tokio::sync 时使用的类型不在范围内: use tokio::sync::RwLock; | ^^^^^ use of undec
我将如何使用自定义 tokio 运行时构建器并且没有主宏来实现这个 tokio_postgres 示例? 这工作正常,根据 tokio_postgres docs : 示例/withmacro.rs
目前我有一个主要的写成 async example for the Reqwest library . #[tokio::main] async fn main() -> Result> { 我们可以
我遵循the mdns Rust documentation并粘贴了示例代码,但它引发以下错误: thread 'main' panicked at 'there is no reactor runn
extern crate tokio; // 0.1.22 use tokio::io; use tokio::net::TcpListener; use tokio::prelude::*; use
我正在尝试使用 tokio 编写一个测试程序,该程序从网站获取文件并将流式响应写入文件。 hyper 网站显示了一个使用 while 循环并使用 .data() 的示例。方法响应主体,但我想用 .ma
我在 prod 中运行一个 rust Tokio 应用程序。在上一个版本中,我有一个错误,一些请求导致我的代码进入无限循环。 发生的事情是当进入无限循环的任务卡住时,所有其他任务继续正常工作并处理请求
下面的程序应该从多个线程定期打印,但是 tokio::time::sleep没有按我预期的那样工作: use tokio::prelude::*; //0.3.4 use tokio::runtime
我使用如下代码启动 Tokio 运行时: tokio::run(my_future); 我的 future 继续启动一堆任务以响应各种条件。 其中一项任务负责确定程序何时关闭。但是,我不知道如何让该任
我正在尝试构建一个可以管理来自 websocket 的提要但能够在多个提要之间切换的对象。 有一个 Feed 特征: trait Feed { async fn start(&mut self
我有一个设置,我的程序使用 std::thread::spawn 为 CPU 绑定(bind)计算生成多个线程。 我需要一个 GRPC 服务器来处理传入的命令并流式传输工作线程完成的输出。我正在为 G
我做计算机系统项目的第一个经历是使用 vanilla Java 构建服务器,然后在 Android 手机上构建客户端。从那时起,我发现有很多框架可以帮助管理可伸缩性并消除编写样板代码的需要。 我正在尝
我将从 Delphi XE4 迁移到 10.2。新的单位名称样式(深灰色背景上的黑色文本)不适合我的视力。有人可以建议如何更改它,最好不使用第 3 方加载项吗? 这就是新样式的样子,我很难阅读事件单位
我一直在寻找tokio源代码来获取问题的答案,并且给人以the sleep method literally puts a timer with duration的印象,但是我认为我可能误解了代码,因
我是一名优秀的程序员,十分优秀!