问题标签 [tokio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
108 浏览

rust - 即使使用 .await 或 block_on,tokio 中的异步处理也不会完成

在下面的伪代码中,我使用了一个async使用 await 的 main 函数和一个使用 block_on 的非异步函数来调用异步函数。在这两种情况下,该过程都没有在那个阶段完成。如果可能,我想等待异步函数执行结束而不使用async

0 投票
2 回答
602 浏览

rust - 在编译时等待一些未知的期货

我想利用 Tokio 的运行时来处理可变数量的异步期货。由于期货的数量在编译时是未知的,因此FuturesUnordered似乎是我最好的选择(宏,例如select!需要在编译时指定您的分支;join_all可能是可能的,但是当订单没有时,文档“在很多情况下”推荐 FuturesUnordered没关系)。

这个片段的逻辑是一个 recv() 循环被推送到期货桶中,它应该总是运行。当新数据到达时,它的解析/处理也被推送到期货桶(而不是立即处理)。这确保了接收器在响应新事件时保持低延迟,并且数据处理(可能计算昂贵的解密)与所有其他数据处理异步块(加上侦听接收器)同时发生。

顺便说一下,这个线程解释了为什么期货得到.boxed()

问题是这个神秘的错误:

看起来像“递归地”推送到 UnorderedFutures (我猜不是真的,但你还能怎么称呼它?)不起作用,但我不知道为什么。此错误表明SyncBox'd & Pin'd 异步块的某些特征要求不符合FuturesUnordered—— 我猜这个要求只是强加的,因为&FuturesUnordered(在此期间使用,futures.push(...)因为该方法借用了 &self)需要它的Send特征... 或者其他的东西?

0 投票
1 回答
347 浏览

rust - 如何在 tokio 中广播流

我正在尝试构建一个 tokio 流,该流应该将其元素发送到其他两个要并行执行的流。

我尝试创建一个广播频道

然后做stream.forward(int_sender),从 构建另外两个流int_receiver,但它不起作用,因为broadcast::Sender没有实现Sink(不像mpsc::Sender)。还有其他选择吗?

0 投票
0 回答
35 浏览

multithreading - 为什么一个 actix_web::rt 未来在另一个处于活动状态时被丢弃,为什么另一个从未被丢弃?

我对 rust 有点陌生,但我开始了解线程生态系统的某些部分。我很难解决以下问题。作为参考,我的代码库在这里(后端/broadcaster.rs 中的问题)。

我有一个Broadcaster提供服务器发送的事件。重要的片段看起来像这样

我想要内在的未来watchspawn_ping燃烧的未来。然而,watch当接收到文件内容事件时触发,spawn_ping仅在watch被注释掉时触发(即何时spawn_ping是唯一的未来运行)。我没有看到任何错误消息。

我相信这个问题可以通过将这些任务中的一个或两个放在后面来解决std::thread,但是我相信我想使用actix_web::rt::spawn它,因为它是基于 tokio 构建的,它更适合在几个线程上运行的许多小任务。我正在寻求了解为什么这没有按预期工作。

0 投票
1 回答
124 浏览

postgresql - 从异步主要调用的 Rust Postgres(同步)驱动程序导致“无法从运行时内启动运行时”

我有一个项目需要使用 postgres 同步驱动程序(第三方库需要同步回调),它公开了一个 GRPC API。

不幸的是,rust-postgres 做了一个block_on嵌套的#[tokio::main]

最小的复制将是:

与依赖项:

我得到错误:

SQL 查询的性能并不重要,我可以很好地阻止它们。我宁愿不切换到,tokio-postgres因为这意味着将所有内容重新包装为同步。

0 投票
1 回答
45 浏览

rust - tokio 的 UdpSocket 没有特征,但 tokio 的 TcpStream 是的?

Tokio 的TcpStream具有

pub fn into_split(self) -> (OwnedReadHalf, OwnedWriteHalf)

返回此元组的方法,其中每个元素都实现AsyncWriteAsyncRead。这样我就可以创建一个 HTTP 客户端来接受实现AsyncWriteAsyncRead.

我找不到任何类似的UdpSocket概念。所以,如果我正在编写一个使用 tokio 的库,UdpSocket那么我不能接受其他实现,UdpSocket因为它不是一个特征。

有什么我想念的吗?我希望我的客户使用UdpSocket,但用户也可以提供他们自己的异步实现UdpSocket

0 投票
1 回答
479 浏览

mongodb - 将 mongodb-1.2.2 与 Rocket-0.5.0-rc.1 一起使用会导致异步运行时不兼容

背景资料

嘿,我正在努力建立一个rocket带有mongodb数据库的休息 api。

我已经能够通过构建器功能创建成功的连接MongoDB Atlas并将生成的客户端置于状态管理中,如下所示:rocketmanage

使用此代码,我不会收到任何启动错误,只是作为旁注。

实际问题

实际问题来自使用客户端状态并获取所有数据库的异步路由。

调用此路由时,控制台会打印以下输出:

因此,使用的异步运行时的版本控制似乎有问题。但我找不到在哪里,因为错误并没有真正给我提示,而且 mongodb rust 驱动程序似乎正在使用0.2.xtokio 版本,即 version ~0.2.18

依赖项

以下是Cargo.toml文件中的所有依赖项:

更新

所以,我获得了更多的洞察力,似乎rocket版本0.5.0-rc.1终于开始使用tokio 1.x异步运行时,而mongodb 1.2.2没有。

这显然带来了一个大问题,因为我要么必须同时运行两个运行时,要么现在甚至放弃 mongodb,这不完全是解决方案的定义......

解决方案

MongoDB 发布了使用tokio 1.x异步运行时的驱动程序的 beta 版本。

这里

0 投票
1 回答
77 浏览

http - 如何在没有 HTTP 库的情况下发送 404 HTTP 响应?

这更多的是为了了解事情是如何工作的,所以请不要建议使用 HTTP 库。

我有以下代码

根据这个问题,它应该是一个有效的最小 HTTP 响应。当我在浏览器中运行并访问该页面时,我得到以下信息

在此处输入图像描述

请注意,该列中没有状态,并且似乎无法识别该消息。

我也尝试过野生动物园,上面写着......

“无法解析响应”(NSURLErrorDomain:-1017)

我错过了什么?

剩下的代码是...

0 投票
0 回答
74 浏览

rust - 如何在未实现“Send”特性的第三方 crate 中使用“tokio::spawn”?

从 Oracle 板条箱命名的结构ResultSet没有实现该Send特征。但是 的定义tokio::spawn要求它产生的未来的结果实现了Send特征。我是否必须修改ResultSet结构才能实现Send?有没有更好的办法?

0 投票
1 回答
52 浏览

multithreading - 是否可以创建一个在运行时开始时分配一次然后跨线程借用的全局变量?

lazy_static不起作用,因为我需要在一些用户交互后在运行时分配给这个变量。thread_local不起作用,因为我需要跨线程读取此变量。

从系统的角度来看,我认为我想做的事情应该很简单。在执行开始时我是单线程的,我初始化了一些东西,然后我做tokio::spawn了一些只需要读取这些东西的任务。

我可以通过使用互斥锁来解决这个问题,但是我真的不明白为什么我应该使用互斥锁,因为我可以保证除了在运行时一开始之外没有任务会尝试获得可变访问权限'我仍然在一个线程中。有没有更好的方法来使用互斥锁?

这是我到目前为止所拥有的,以防有人好奇:

我不明白为什么我需要使用这个互斥锁......我很乐意unsafe在分配期间使用它,但我不想每次我想阅读时都使用它。