新的Web开发框架:tower-web
tower-web 是一个异步HTTP Web框架,基于Tokio、hyper和Tower,适用于Stable Rust。
#[macro_use]
extern crate tower_web;
use tower_web::ServiceBuilder;
#[derive(Clone, Debug)]
struct HelloWorld;
impl_web! {
impl HelloWorld {
/// @get("/")
fn hello_world(&self) -> Result<String, ()> {
Ok("Hello world".to_string())
}
/// @get("/async")
fn hello_future(&self) -> impl Future<Item = String, Error = ()> + Send {
// async implementation
}
}
}
pub fn main() {
let addr = "127.0.0.1:8080".parse().expect("Invalid address");
println!("Listening on http://{}", addr);
ServiceBuilder::new()
.resource(HelloWorld)
.run(&addr)
.unwrap();
}
看上面这个例子,tower-web为了支持Stable Rust,在impl_web!宏里通过解析文档注释 @get("/")来告诉框架 GET / 路由匹配到hello_world上面。 如果Rust的自定义属性宏稳定了,会切换到属性宏之上。
tower-web遵循 约定优于配置的理念(来源于Rails框架)。
该文章只是一个简单的介绍,并没有提到Tower Web的中间件功能,可以翻看tower-web的源码来查看:
pub trait Middleware<S> {
/// The wrapped service request type
type Request;
/// The wrapped service response type
type Response;
/// The wrapped service's error type
type Error;
/// The wrapped service
type Service: Service<Request = Self::Request,
Response = Self::Response,
Error = Self::Error>;
/// Wrap the given service with the middleware, returning a new servicee
/// that has been decorated with the middleware.
fn wrap(&self, inner: S) -> Self::Service;
/// Return a new `Middleware` instance that applies both `self` and
/// `middleware` to services being wrapped.
///
/// This defines a middleware stack.
fn chain<T>(self, middleware: T) -> Chain<Self, T>
where T: Middleware<Self::Service>,
Self: Sized,
{
Chain::new(self, middleware)
}
}
Tower Web实现中间件的思路,提供了一个Middleware trait,可以通过实现该trait来定义自己的中间件。如果对Rails框架有了解的话,可以看得出来,该中间件协议有点像 Rack, 通过wrap方法包装自定义的行为,插入到Tower Web 的 Service 栈中。
注意: 在未来的一个月内, tower-web会成为 Wrap异步框架的一部分。
Rust 2018 网络工作组的愿景
网络工作组在重启之后,建立了三个重要工作领域:
- 异步基础。将async/await逐渐稳定,并构建相关文档。
- 嵌入式网络基础。目标是支持Rust物联网的开发。 为no_std异步IO和硬件访问构建可重用组件,建立从硬件到应用的异步IoT 技术栈原型。
- 网络基础。目标是改进Rust的Web编程。强化Web组件,即评估Web编程基础组件(http、url等),编写相关文档、改造API等。构建Rise,一个模块化框架,是为了工作组全面了解Web开发生态而创建。偏重于异步Web编程。以后可以基于Rise来构建自己的Web框架。
Rust的GPGPU支持状态
GPGPU(General Purpose GPU),通用计算图形处理器。专注于利用GPU加速图像处理的技术。
目前广泛使用的GPGPU平台主要有OpenCL和CUDA,Rust目前对OpenCL的支持和C一样好,本文作者考察了两个Rust实现的OpenCL绑定库rust-opencl和ocl,发现ocl好一些,对底层的控制更加自由。
但是目前市场上CUDA使用率比较高,因为CUDA为GPGPU提供了更简单的方法。然而经过作者考察以后发现,Rust对CUDA支持的比较粗糙,使用起来极不方便,一点都不理想。Rust中的CUDA并没有为生产做好准备,还需要做很多工作来赶上C中的CUDA。
作者认为 GPGPU是Rust系统级高性能语言的重要用例。它与许多领域相关,包括机器学习,加密,加密货币,图像处理,物理模拟和科学计算。所以他打算改善这一情况,准备和Rust编译器团队进行合作,对rustc和LLVM进行改造。
很期待!
Discord游戏商店大量使用Rust
一个可以将C++ mangled 符号名解析为Rust值的包
比如可以将类似于 _ZN5space3fooEii
这样的值,解析为Rust的对应结构。
自定义测试框架的探索
Rust社区最近批准了一个自定义测试框架的eRPC,为自定义框架提供了一系列目标和可能的方向。
本文阐述了相关原理
Rust并发模式文章导读:天生管道流
本文是对Go 管道模式的实现,但不是模仿Go,而是构建Rusty的管道
管道介绍:
管道是一系列联通的阶段(stage),在每一段中:
- 通过 流入channel接收上游数据
- 运行一些函数处理数据,产生新的值
- 通过流出channel将数据发送给下游
每一个阶段都有任意个流入channel或流出channel,其中,第一个阶段只有流入channel,最后一个阶段只有流出channel。第一个阶段有时候被称为源或者生产者,最后一个被称为槽或者消费者。
(想象一下,古人取水通过竹节一段一段连通而成的运水管道)
本文用Rust实现的管道,包含三个阶段:
- generate 生成数字
- square 使用worker对数字求平方
- merge,对结果进行合并
本文使用以下特性来实现Rusty的管道:
- thread
- Iterator trait
- for循环
- mpsc::Receiver
- Drop trait
实现了三个函数:generate、square和merge。
- generate函数中, 生成一个子线程,通过gen_chan的Sender来发送生成的数字
- square函数,同样生成一个子线程,并且构建了新的channel,将接收到的数字通过迭代进行计算,将计算结果发送给merge channel
- merge函数,同样生成一个子线程,并且构建了新的channel,将接收到的square计算结果发送给主线程
想想 并发模式第一篇文章
评论区
写评论还没有评论