问题标签 [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.
rust - 即使使用 .await 或 block_on,tokio 中的异步处理也不会完成
在下面的伪代码中,我使用了一个async
使用 await 的 main 函数和一个使用 block_on 的非异步函数来调用异步函数。在这两种情况下,该过程都没有在那个阶段完成。如果可能,我想等待异步函数执行结束而不使用async
。
rust - 在编译时等待一些未知的期货
我想利用 Tokio 的运行时来处理可变数量的异步期货。由于期货的数量在编译时是未知的,因此FuturesUnordered似乎是我最好的选择(宏,例如select!
需要在编译时指定您的分支;join_all可能是可能的,但是当订单没有时,文档“在很多情况下”推荐 FuturesUnordered没关系)。
这个片段的逻辑是一个 recv() 循环被推送到期货桶中,它应该总是运行。当新数据到达时,它的解析/处理也被推送到期货桶(而不是立即处理)。这确保了接收器在响应新事件时保持低延迟,并且数据处理(可能计算昂贵的解密)与所有其他数据处理异步块(加上侦听接收器)同时发生。
顺便说一下,这个线程解释了为什么期货得到.boxed()
。
问题是这个神秘的错误:
看起来像“递归地”推送到 UnorderedFutures (我猜不是真的,但你还能怎么称呼它?)不起作用,但我不知道为什么。此错误表明Sync
Box'd & Pin'd 异步块的某些特征要求不符合FuturesUnordered
—— 我猜这个要求只是强加的,因为&FuturesUnordered
(在此期间使用,futures.push(...)
因为该方法借用了 &self)需要它的Send
特征... 或者其他的东西?
rust - 如何在 tokio 中广播流
我正在尝试构建一个 tokio 流,该流应该将其元素发送到其他两个要并行执行的流。
我尝试创建一个广播频道
然后做stream.forward(int_sender)
,从 构建另外两个流int_receiver
,但它不起作用,因为broadcast::Sender
没有实现Sink
(不像mpsc::Sender
)。还有其他选择吗?
multithreading - 为什么一个 actix_web::rt 未来在另一个处于活动状态时被丢弃,为什么另一个从未被丢弃?
我对 rust 有点陌生,但我开始了解线程生态系统的某些部分。我很难解决以下问题。作为参考,我的代码库在这里(后端/broadcaster.rs 中的问题)。
我有一个Broadcaster
提供服务器发送的事件。重要的片段看起来像这样
我想要内在的未来watch
和spawn_ping
燃烧的未来。然而,watch
当接收到文件内容事件时触发,spawn_ping
仅在watch
被注释掉时触发(即何时spawn_ping
是唯一的未来运行)。我没有看到任何错误消息。
我相信这个问题可以通过将这些任务中的一个或两个放在后面来解决std::thread
,但是我相信我想使用actix_web::rt::spawn
它,因为它是基于 tokio 构建的,它更适合在几个线程上运行的许多小任务。我正在寻求了解为什么这没有按预期工作。
postgresql - 从异步主要调用的 Rust Postgres(同步)驱动程序导致“无法从运行时内启动运行时”
我有一个项目需要使用 postgres 同步驱动程序(第三方库需要同步回调),它公开了一个 GRPC API。
不幸的是,rust-postgres 做了一个block_on
嵌套的#[tokio::main]
最小的复制将是:
与依赖项:
我得到错误:
SQL 查询的性能并不重要,我可以很好地阻止它们。我宁愿不切换到,tokio-postgres
因为这意味着将所有内容重新包装为同步。
rust - tokio 的 UdpSocket 没有特征,但 tokio 的 TcpStream 是的?
Tokio 的TcpStream具有
pub fn into_split(self) -> (OwnedReadHalf, OwnedWriteHalf)
返回此元组的方法,其中每个元素都实现AsyncWrite
和AsyncRead
。这样我就可以创建一个 HTTP 客户端来接受实现AsyncWrite
和AsyncRead
.
我找不到任何类似的UdpSocket概念。所以,如果我正在编写一个使用 tokio 的库,UdpSocket
那么我不能接受其他实现,UdpSocket
因为它不是一个特征。
有什么我想念的吗?我希望我的客户使用UdpSocket
,但用户也可以提供他们自己的异步实现UdpSocket
mongodb - 将 mongodb-1.2.2 与 Rocket-0.5.0-rc.1 一起使用会导致异步运行时不兼容
背景资料
嘿,我正在努力建立一个rocket
带有mongodb
数据库的休息 api。
我已经能够通过构建器功能创建成功的连接MongoDB Atlas
并将生成的客户端置于状态管理中,如下所示:rocket
manage
使用此代码,我不会收到任何启动错误,只是作为旁注。
实际问题
实际问题来自使用客户端状态并获取所有数据库的异步路由。
调用此路由时,控制台会打印以下输出:
因此,使用的异步运行时的版本控制似乎有问题。但我找不到在哪里,因为错误并没有真正给我提示,而且 mongodb rust 驱动程序似乎正在使用0.2.x
tokio 版本,即 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 版本。
http - 如何在没有 HTTP 库的情况下发送 404 HTTP 响应?
这更多的是为了了解事情是如何工作的,所以请不要建议使用 HTTP 库。
我有以下代码
根据这个问题,它应该是一个有效的最小 HTTP 响应。当我在浏览器中运行并访问该页面时,我得到以下信息
请注意,该列中没有状态,并且似乎无法识别该消息。
我也尝试过野生动物园,上面写着......
“无法解析响应”(NSURLErrorDomain:-1017)
我错过了什么?
剩下的代码是...
rust - 如何在未实现“Send”特性的第三方 crate 中使用“tokio::spawn”?
从 Oracle 板条箱命名的结构ResultSet
没有实现该Send
特征。但是 的定义tokio::spawn
要求它产生的未来的结果实现了Send
特征。我是否必须修改ResultSet
结构才能实现Send
?有没有更好的办法?
multithreading - 是否可以创建一个在运行时开始时分配一次然后跨线程借用的全局变量?
lazy_static
不起作用,因为我需要在一些用户交互后在运行时分配给这个变量。thread_local
不起作用,因为我需要跨线程读取此变量。
从系统的角度来看,我认为我想做的事情应该很简单。在执行开始时我是单线程的,我初始化了一些东西,然后我做tokio::spawn
了一些只需要读取这些东西的任务。
我可以通过使用互斥锁来解决这个问题,但是我真的不明白为什么我应该使用互斥锁,因为我可以保证除了在运行时一开始之外没有任务会尝试获得可变访问权限'我仍然在一个线程中。有没有更好的方法来使用互斥锁?
这是我到目前为止所拥有的,以防有人好奇:
我不明白为什么我需要使用这个互斥锁......我很乐意unsafe
在分配期间使用它,但我不想每次我想阅读时都使用它。