问题标签 [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 - 限制超级服务器中的并发传入连接数
我们已经使用超网络框架创建了一个网络服务器。问题是,当服务器负载过重时,传入连接会因套接字超时而失败。
我已经增加了文件句柄的数量,但没有效果。
出于这个原因,我想在不拒绝 TCP 连接的情况下限制并行连接/东京线程的数量。只是为了限制服务器负载,以便同时处理一定数量的请求。
有没有人有这方面的经验并且知道一种对传入请求进行排队的好方法,以便在任何时候只有 n 个并发线程在运行?
在操场上,您可以看到 hyper 是如何使用的。
提前致谢!
rust - 使用 tonic::Status 和 redis::RedisError 对 Redis 和 Tonic 异步应用程序进行正确的错误处理
我正在制作一个使用 Redis 客户端的基于 Tonic 的 gRPC 微服务。我想不出在发生异步错误时将 a 隐式转换RedisError
为 a的示例。tonic::Status
来自 Redis 客户端的连接可能会失败以及设置失败。我正在使用使用 Tokio 的异步接口。我宁愿不要map
错误,因为这似乎破坏了异步。
我在想我需要实现这个特性From<Status>
,From<RedisError
但不知道该怎么做。这是我的尝试,但它不起作用,因为 Tonic 想要一个tonic::Status
结构而不是ApiError
我制作的结构:
http - 如何使用 Rust/Axum 设计测试友好的应用程序?
当我尝试使用Rust/Axum构建应用程序时,我未能将Axum框架与我自己的处理程序分开。使用Golang,经典的方法是定义一个Interface
,实现它并将处理程序注册到框架。这样,很容易提供模拟handler
和测试。但是,我无法使用Axum。我在上面定义了 a trait
,但它无法编译。
此处列出了一个演示:
并且这里列出了Rust报告的错误。
我想关键是我的设计不土气。Axum 项目有什么典型的布局吗?或一些有用的建议?
rust - tracking-appender crate 将颜色伪影附加到日志
当我尝试使用tracking-appender将日志写入文件时,我会得到带有颜色伪影([2m, [0m
等)的文本,这些文本不会在文本文件中呈现。有没有办法丢弃这些文物?
[2mOct 02 23:44:57.484[0m [34mDEBUG[0m
asynchronous - 异步 tokio 应用程序中的读/写问题(初学者)
我是 Rust 网络编程和线程的新手,所以我可能在这里遗漏了一些明显的东西。我一直在尝试构建一个简单的聊天应用程序。只是,他用标准库来做,而我正在尝试用 tokio 来做。功能非常简单:客户端向服务器发送消息,服务器确认并将其发送回客户端。这是我的客户端和服务器代码,尽可能地精简:
服务器.rs
客户端.rs
发送到服务器工作正常,服务器似乎正在成功写入,如其输出所示:
问题是客户端永远不会从服务器读回消息,而是WouldBlock
每次遇到match client.try_read(&mut buffer)
块时都会出错。
如果我在保持客户端运行的同时停止服务器,客户端会突然被成功读取的空消息淹没:
谁能告诉我发生了什么事?
rust - 如何在`tokio`中获得与sync_channel(0)等效的内容?
我有一个项目需要大量 IO 绑定线程(可能数百个),这使得tokio
运行时比标准线程更理想。
但是,我还需要同时阻止发送方和接收方的会合通道。
std::sync::mpsc
有sync_channel(0)
,但在 中没有等价物tokio::sync::mpsc
。channel(0)
会恐慌。
我怎样才能把这两件事结合起来?标准频道还能用吗?
rust - 如何避免为 MutexGuard 接口移动可能未初始化的变量?
对于以下代码:
CONVMODEL.lock().await
是MutexGuard<T>
而且conv_model_loader()
只是T
我需要这两个通用接口,所以我不能在两种情况下复制粘贴我的代码,因为它只会与这种类型不同,其他任何东西都是一样的。
编辑:
有代码......(至少我试图做的)
但我失败了,因为
所以问题实际上是如何MutexGuard
使用接口&T
但在内部使用spawn_blocking
它#[async_recursion]
编辑:
以下代码正在运行,但实际上非常难看 XD(我想知道是否可以简化此代码)
rust - 多个阻塞线程池?
我正在将 Tokio 用于一些异步 Rust 代码,并且遇到了问题。我有一些需要访问连接池的任务,并且连接池的性质意味着一次只能运行一个固定数量(NUMCPUS) - 所有其他请求都会阻塞,直到有空闲连接。
目前,我只是在使用 task::spawn_blocking,这很有效。但是,这样做的缺点是,一旦有 512 个请求在连接池上阻塞,Tokio 的整个阻塞池就会耗尽,所有阻塞任务都只是排队。这可以防止代码中其他地方不依赖连接池的任何 spawn_blocking 调用也运行。
有没有办法告诉 Tokio 保持一组特定的阻塞任务分开,一次只产生 N 个,同时仍然允许不相关的阻塞任务运行而不排队?
spawn_blocking 文档建议将 Rayon 用于 CPU 密集型任务,但是 a) 不清楚如何将 Rayon 与 Tokio 集成 b) 我的任务无论如何都不是 CPU 密集型的。
rust - 运行循环,直到未来完成或超时
我正在尝试在 Rust 中实现一个基本的迭代深化算法:
我的实现的问题是它似乎永远不会超时,而是继续下一个循环迭代并在它试图表示负持续时间时引起恐慌。
从 main 调用该函数,如下所示:
为什么函数没有按原样超时并返回?
rust - 受 tokio 的 RwLock 保护的多个字段的序列化
我使用 tokio 来监听 UDP 套接字。我发送/接收bincode
编码结构并使用serde
.
但是我应该如何处理Arc<tokio::sync::RwLock<T>>
字段的序列化?(我知道 serde 支持标准库同步RwLock
,但我需要异步)。
数据经常通过网络更改和传输(根据设计),因此每次我需要发送内容时等待多个读取锁可能不是一个好主意。
考虑到 serde 是同步的,我必须为每个RwLock
字段生成阻塞 tokio 任务。(每个领域都有RwLock
自己的领域)。所以这会变得非常慢。
处理这个的生锈方法是什么?
例子: