- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试在不使用 tokio 的情况下使用
.UnboundedSender
和 UnboundedReceiver
时,出现错误:当前没有任务正在运行
: :run()
这是错误:
Press Ctrl-C to abort
thread 'receiver thread' panicked at 'no Task is currently running', src/libcore/option.rs:1166:5
stack backtrace:
0: backtrace::backtrace::libunwind::trace
at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/libunwind.rs:88
1: backtrace::backtrace::trace_unsynchronized
at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/mod.rs:66
2: std::sys_common::backtrace::_print
at src/libstd/sys_common/backtrace.rs:47
3: std::sys_common::backtrace::print
at src/libstd/sys_common/backtrace.rs:36
4: std::panicking::default_hook::{{closure}}
at src/libstd/panicking.rs:200
5: std::panicking::default_hook
at src/libstd/panicking.rs:214
6: std::panicking::rust_panic_with_hook
at src/libstd/panicking.rs:477
7: std::panicking::continue_panic_fmt
at src/libstd/panicking.rs:384
8: rust_begin_unwind
at src/libstd/panicking.rs:311
9: core::panicking::panic_fmt
at src/libcore/panicking.rs:85
10: core::option::expect_failed
at src/libcore/option.rs:1166
11: core::option::Option<T>::expect
at /rustc/dddb7fca09dc817ba275602b950bb81a9032fb6d/src/libcore/option.rs:345
12: futures::task_impl::with
at /home/nickhash/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/task_impl/mod.rs:46
13: futures::task_impl::current
at /home/nickhash/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/task_impl/mod.rs:118
14: futures::sync::mpsc::Receiver<T>::try_park
at /home/nickhash/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/sync/mpsc/mod.rs:902
15: <futures::sync::mpsc::Receiver<T> as futures::stream::Stream>::poll
at /home/nickhash/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/sync/mpsc/mod.rs:936
16: <futures::sync::mpsc::UnboundedReceiver<T> as futures::stream::Stream>::poll
at /home/nickhash/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/sync/mpsc/mod.rs:1004
17: fut2::launch_receiver_thread::{{closure}}
at src/main.rs:16
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
^C
我正在运行的代码是:
use std:: {thread,time::Duration};
use futures::stream::*;
use futures::prelude::*;
fn launch_sender_thread(tx: futures::sync::mpsc::UnboundedSender<()>) {
let _ = thread::Builder::new().name("sender thread".to_string()).spawn(move || {
loop {
tx.clone().send(());
thread::sleep(Duration::from_millis(3000));
}
});
}
fn launch_receiver_thread(mut rx: futures::sync::mpsc::UnboundedReceiver<()>) {
let _ = thread::Builder::new().name("receiver thread".to_string()).spawn(move || {
match rx.poll() {
Ok(Async::Ready(Some(_))) => {
println!("thread2: received data");
},
Ok(_) => (),
Err(err) => {
println!("poll err {:?}",err);
},
}
thread::sleep(Duration::from_millis(1000));
});
}
fn main() {
let (sender, receiver) = futures::sync::mpsc::unbounded::<()>();
launch_receiver_thread(receiver);
launch_sender_thread(sender);
println!("Press Ctrl-C to abort");
thread::sleep(Duration::from_millis(10000000));
}
所以,基本上我想从一个线程向另一个线程发送和接收数据,但不使用 Future
对象,这可能吗?如果不可能,那么我该如何通过最少使用 Futures crate 来修复这个错误?要求是使用 futures::sync::mpsc::UnboundedSender
和 futures::sync::mpsc::UnboundedSender
进行通信。
Cargo.toml:
[package]
name = "fut2"
version = "0.1.0"
edition = "2018"
[dependencies]
futures = { version = "0.1" }
最佳答案
but without using the Future object, is this possible?
可以使用 UnboundedSender
和 UnboundedSender
与 futures crate 进行最少的交互,但您必须将 futures 与任务一起使用。但这不完全是你的错; future 文档和 API 设计对此不是很清楚。在其 0.2
版本中,将有一个 task context通过各种 API 调用显式线程化。例如,Stream::poll
在 0.1.x
中定义为:
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error>
在0.2.x
中,是Stream::poll_next
:
fn poll_next(
&mut self,
cx: &mut Context
) -> Result<Async<Option<Self::Item>>, Self::Error>
因此您将无法在任务之外犯同样的轮询错误。
在那之前这适用于 0.1.x
futures crate:
use futures::sync::mpsc::{UnboundedReceiver, UnboundedSender};
use std::thread::{self, JoinHandle};
fn launch_sender_thread(tx: UnboundedSender<()>) -> JoinHandle<()> {
thread::Builder::new()
.name("sender thread".to_string())
.spawn(move || loop {
let _ = tx.unbounded_send(());
})
.unwrap()
}
fn launch_receiver_thread(rx: UnboundedReceiver<()>) -> JoinHandle<()> {
thread::Builder::new()
.name("receiver thread".to_string())
.spawn(move || {
let mut task = futures::executor::spawn(rx);
match task.wait_stream() {
Some(Ok(_)) => println!("thread2: received data"),
Some(Err(e)) => println!("poll err {:?}", e),
None => (),
}
})
.unwrap()
}
fn main() {
let (sender, receiver) = futures::sync::mpsc::unbounded::<()>();
let recv = launch_receiver_thread(receiver);
let send = launch_sender_thread(sender);
println!("Press Ctrl-C to abort");
recv.join().unwrap();
send.join().unwrap();
}
请注意,您也可以使用任务驱动 tx
。在这里调用 unbounded_send
更简单。
关于rust - 当前没有任务正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58227120/
Task.WaitAll 方法等待所有任务,Task.WaitAny 方法等待一个任务。如何等待任意N个任务? 用例:下载搜索结果页面,每个结果都需要一个单独的任务来下载和处理。如果我使用 WaitA
我正在查看一些像这样的遗留 C# 代码: await Task.Run(() => { _logger.LogException(LogLevel.Error, mes
如何在 Linux 中运行 cron 任务? 关注此Q&A ,我有这个 cron 任务要运行 - 只是将一些信息写入 txt 文件, // /var/www/cron.php $myfile = fo
原谅我的新手问题,但我想按顺序执行三个任务并在剧本中使用两个角色: 任务 角色 任务 角色 任务 这是我到目前为止(任务,角色,任务): --- - name: Task Role Task ho
我有一个依赖于 installDist 的自定义任务 - 不仅用于执行,还依赖于 installDist 输出: project.task('run', type: JavaExec, depends
从使用 Wix 创建的 MSI 运行卸载时,我需要在尝试删除任何文件之前强行终止在后台运行的进程。主要应用程序由一个托盘图标组成,它反射(reflect)了 bg 进程监控本地 Windows 服务的
我想编写 Ant 任务来自动执行启动服务器的任务,然后使用我的应用程序的 URL 打开 Internet Explorer。 显然我必须执行 startServer先任务,然后 startApplic
使用 ASP.NET 4.5,我正在尝试使用新的 async/await 玩具。我有一个 IDataReader 实现类,它包装了一个特定于供应商的阅读器(如 SqlDatareader)。我有一个简
使用命令 gradle tasks可以得到一份所有可用任务的报告。有什么方法可以向此命令添加参数并按任务组过滤任务。 我想发出类似 gradle tasks group:Demo 的命令筛选所有任务并
除了sshexec,还有什么办法吗?任务要做到这一点?我知道您可以使用 scp 复制文件任务。但是,我需要执行其他操作,例如检查是否存在某些文件夹,然后将其删除。我想使用类似 condition 的东
假设我有字符串 - "D:\ApEx_Schema\Functions\new.sql@@\main\ONEVIEW_Integration\3" 我需要将以下内容提取到 diff 变量中 - 文档名
我需要编写一个 ant 任务来确定某个文件是否是只读的,如果是,则失败。我想避免使用自定义选择器来为我们的构建系统的性质做这件事。任何人都有任何想法如何去做?我正在使用 ant 1.8 + ant-c
这是一个相当普遍的计算机科学问题,并不特定于任何操作系统或框架。 因此,我对与在线程池上切换任务相关的开销感到有些困惑。在许多情况下,给每个作业分配自己的特定线程是没有意义的(我们不想创建太多硬件线程
我正在使用以下 Ansible playbook 一次性关闭远程 Ubuntu 主机列表: - hosts: my_hosts become: yes remote_user: my_user
如何更改 Ant 中的当前工作目录? Ant documentation没有 任务,在我看来,最好的做法是不要更改当前工作目录。 但让我们假设我们仍然想这样做——你会如何做到这一点?谢谢! 最佳答案
是否可以运行 cronjob每三天一次?或者也许每月 10 次。 最佳答案 每三天运行一次 - 或更短时间在月底运行一次。 (如果上个月有 31 天,它将连续运行 2 天。) 0 0 */3 * *
如何在 Gradle 任务中执行托管在存储库中的工具? 在我的具体情况下,我正在使用 Gradle 构建一个 Android 应用程序。我添加了一项任务,将一些 protobuf 数据从文本编码为二进
我的项目有下一个结构: Root |- A |- C (depends on A) \- B (depends on A) 对于所有子项目,我们使用自己的插件生成资源:https://githu
我设置了一个具有4个节点的Hadoop群集,其中一个充当HDFS的NameNode以及Yarn主节点。该节点也是最强大的。 现在,我分发了2个文本文件,一个在node01(名称节点)上,一个在node
在 TFS 2010 中为多个用户存储任务的最佳方式是什么?我只能为一项任务分配一个。 (例如:当我计划向所有开发人员演示时) (这是一个 Scrum Msf 敏捷项目,其中任务是用户故事的一部分)
我是一名优秀的程序员,十分优秀!