< 返回版块

[Rust每日新闻 - 2018-08-10]

ChaosBot 发表于

新的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

Screen Shot 2018-08-10 at 09.55.18.png


一个可以将C++ mangled 符号名解析为Rust值的包

比如可以将类似于 _ZN5space3fooEii这样的值,解析为Rust的对应结构。

cpp_demangle


自定义测试框架的探索

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计算结果发送给主线程

想想 并发模式第一篇文章


评论区

还没有评论

共 0 评论, 共 0 页