Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【crossbeam系列】4 crossbeam-channel:加强版channel

【crossbeam系列】4 crossbeam-channel:加强版channel

作者头像
MikeLoveRust
发布于 2020-09-23 07:11:44
发布于 2020-09-23 07:11:44
3K11
代码可运行
举报
运行总次数:1
代码可运行

这一期的内容会轻松一些,讲讲crossbeam中的channel。可是有人就要问了在标准库里面已经有了std::sync::mpsc,为什么crossbeam又要搞出一套channel呢?首先我们来看看标准库中的channel有哪些不足吧

标准库中channel的不足

  1. Receiver不能被clone,是MPSC的channel。理想状况我们希望能有MPMC的channel
  2. Sender和Receiver不是Sync
  3. 在Go语言中,channel一般和select语句一起使用,但是标准库中的channel并不支持select
  4. 有限容量(Bounded)的channel内部实现就是一个简单的Mutex<VecDeque<T>>,性能比Go语言的channel还差
  5. 有Sender(=Unbouded)和SyncSender(=Bounded)的区分,用起来不统一。

crossbeam中加强版的channel

首先,无论容量是否有限,Sender类型统一成一种,这样用起来就很方便。其次对有限容量的channel进行了重写(还记得上一期我们讲的Deque其实就是为了消除Mutex<VecDeque<T>>产生的瓶颈么,这里也类似。对于1-3点:(在此之前我们先简单讲下如何创建crossbeam的channel)

创建channel

有限容量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use crossbeam_channel::bounded;

// 创建一个容量是5的channel
let (s, r) = bounded(5);

// 5条消息之内都不会阻塞
for i in 0..5 {
    s.send(i).unwrap();
}

// 超过5条就会阻塞了
// s.send(5).unwrap();

无限容量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use crossbeam_channel::unbounded;

// 创建一个无限容量的channel
let (s, r) = unbounded();

// 不会阻塞
for i in 0..1000 {
    s.send(i).unwrap();
}

·

1 支持MPMC

现在终于不用笨拙地给Receiver端加锁了~

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use std::thread;
use crossbeam_channel::bounded;

let (s1, r1) = bounded(0);
let (s2, r2) = (s1.clone(), r1.clone());

// 起一个线程先接受一个消息然后发出一个消息
thread::spawn(move || {
    r2.recv().unwrap();
    s2.send(2).unwrap();
});

// 发送一个消息然后接受一个消息
s1.send(1).unwrap();
r1.recv().unwrap();

2 Sender和Receiver是Sync

所以现在可以把引用在线程间传递了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use std::thread;
use crossbeam_channel::bounded;
use crossbeam_utils::thread::scope;

let (s, r) = bounded(0);

scope(|scope| {
    // 起一个线程先接受一个消息然后发出一个消息
    scope.spawn(|_| {
        r.recv().unwrap();
        s.send(2).unwrap();
    });

    // 发送一个消息然后接受一个消息
    s.send(1).unwrap();
    r.recv().unwrap();
}).unwrap();

3 支持select

提供了类似Go语言功能的select宏,支持使用default分支处理超时等逻辑

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use std::thread;
use std::time::Duration;
use crossbeam_channel::unbounded;

let (s1, r1) = unbounded();
let (s2, r2) = unbounded();

thread::spawn(move || s1.send(10).unwrap());
thread::spawn(move || s2.send(20).unwrap());

select! {
    recv(r1) -> msg => assert_eq!(msg, Ok(10)),
    recv(r2) -> msg => assert_eq!(msg, Ok(20)),
    default(Duration::from_secs(1)) => println!("timed out"),
}

并且其实select内部不仅仅支持接受消息,也支持发送消息。同时还有更高级的动态select支持~

小结

我们看到,crossbeam的channel优雅的解决了标准库中上述的5个问题,看来没事可以多用用了~下一期我们会讲一下crossbeam-util和crossbeam-queue,敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
感谢分享,最后的produces = "application/json,charset=utf-8"笔误了,应该是"application/json;charset=utf-8"
感谢分享,最后的produces = "application/json,charset=utf-8"笔误了,应该是"application/json;charset=utf-8"
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day9】 —— SpringBoot1
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/10/13
5210
SpringMVC-@RequestMapping的参数和用法
从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
全栈程序员站长
2022/09/01
8010
SpringMVC-@RequestMapping的参数和用法
SpringMVC系列第2篇:@Controller、@RequestMapping
用来标注在类上,表示这个类是一个控制器类,可以用来处理 http 请求,通常会和@RequestMapping 一起使用。
路人甲Java
2021/06/25
7350
SpringMVC系列第2篇:@Controller、@RequestMapping
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现。 控制器解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器可以包含多个Action(动作、方法)。
张果
2022/05/09
1.1K0
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
《Springboot极简教程》问题解决:Spring MVC 关于controller的字符编码问题描述原因分析@RequestMapping
在使用springMVC框架构建web应用,返回http请求json格式的数据,中文乱码。
一个会写诗的程序员
2018/08/20
1.3K0
Springmvc之RequestMapping
Springmvc之RequestMapping 本人独立博客https://chenjiabing666.github.io RequestMapping 标记客户的请求与哪一个类和方法对应 使用@RequestMapping同时对类和方法进行注解,相当于最终将这两处的注解路径拼接起来,比如类上使用@RequestMapping("/user"),在方法上使用@RequestMapping("/login.do"),那么拼接时访问的路径为http://localhost:8080/ProjectName/
爱撒谎的男孩
2018/05/10
1.2K1
Springmvc之RequestMapping
快速学习-@RequestMapping注解
带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中: URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。
cwl_java
2020/02/19
5840
Content-Type与SpringMVC
在Http请求中,使用Content-Type来指定不同格式的请求信息,全面了解Content-Type中允许的值是什么,有时对开发非常有好处,这里将讲解Content-Type的可用值,以及在Spring MVC中如何使用它们来映射请求信息。
BUG弄潮儿
2020/06/12
1.2K0
Content-Type与SpringMVC
SpringBoot学习笔记(三)——Spring MVC控制器、 Restful、Swagger
控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现。 控制器解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器可以包含多个Action(动作、方法)。
张果
2022/05/09
1.6K0
SpringBoot学习笔记(三)——Spring MVC控制器、 Restful、Swagger
@RequestMapping 用法详解之地址映射
前段时间项目中用到了RESTful模式来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam、 @RequestBody、 @RequestHeader 、 @PathVariable)进行了研究,同时也看了一下HttpMessageConverter的相关内容,在此一并总结。
Java编程指南
2019/08/02
1.4K0
@RequestMapping 用法详解之地址映射
SpringMVC基础
SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。
用户9645905
2023/11/19
2730
SpringMVC基础
【刨根问底】在Springboot中MVC的常用注解<中>
@RequestMapping注解是我们在开发web项目中使用最多的注解之一,前段时间面试很多人的时候,发现很多人也就是用用而已, 更奇葩的是遇到两个人干了将近三年了,说这个注解没见过或者不知道怎么用。个人认为如果你是个三年以下的程序员这主要是能干活为主,如果最基本的一些东西你都不知道或者不清楚,那么会很尴尬的。扯远了!!!回到咱们的话题,咱们来看看@RequestMapping这个注解到底是个什么东东,
田维常
2019/07/16
6510
【刨根问底】在Springboot中MVC的常用注解<中>
2. RequestMapping注解
​@RequestMapping​ 注解是 Spring MVC 框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上。具体来说,它可以将指定 URL 的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。
捞月亮的小北
2024/06/26
1960
2. RequestMapping注解
Spring源码系列:注解详解
因为要看Spring中注解的具体定义,所以在说之前,先来简单说下JAVA中注解的一些基本知识。
磊叔的技术博客
2025/06/07
380
Spring源码系列:注解详解
SpringMVC_总结_03_SpringMVC相关注解
在前面的小节中,我们配置了注解驱动和自动扫描包,然后就可以使用SpringMVC相关注解了。
shirayner
2018/09/20
3840
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器
.29.
2023/10/17
3800
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
@RequestMapping
@RequestMapping 是 Spring Framework 中用于映射 URL 到控制器方法的注解。它被用于将一个特定的 URL 请求映射到一个处理该请求的方法上。在 Spring 的 Web 应用程序中,@RequestMapping 注解通常用于控制器类的方法上,以确定哪个方法将处理特定的 HTTP 请求。
用户4396583
2024/07/16
1310
Spring MVC中常用注解之RequestMapping详解
林老师带你学编程
2018/01/03
1.4K0
@RequestMapping与@RequestParam注解
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。 该注解不仅可以用于方法上,还可以用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,例如可以加个虚拟目录什么的。
端碗吹水
2020/09/23
4940
@RequestMapping与@RequestParam注解
《JavaEE进阶》----5.<SpringMVC②剩余基本操作(Cookie&Session&Header&响应)>
默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信和下次通信之间没有直接的联系.
用户11288958
2024/09/24
1280
《JavaEE进阶》----5.<SpringMVC②剩余基本操作(Cookie&Session&Header&响应)>
推荐阅读
相关推荐
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day9】 —— SpringBoot1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验