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

2021-01-08 騰訊網

這一期的內容會輕鬆一些,講講crossbeam中的channel。可是有人就要問了在標準庫裡面已經有了std::sync::mpsc,為什麼crossbeam又要搞出一套channel呢?首先我們來看看標準庫中的channel有哪些不足吧

標準庫中channel的不足

Receiver不能被clone,是MPSC的channel。理想狀況我們希望能有MPMC的channel

Sender和Receiver不是Sync。

在Go語言中,channel一般和select語句一起使用,但是標準庫中的channel並不支持select

有限容量(Bounded)的channel內部實現就是一個簡單的Mutex,性能比Go語言的channel還差

有Sender(=Unbouded)和SyncSender(=Bounded)的區分,用起來不統一。

crossbeam中加強版的channel

首先,無論容量是否有限,Sender類型統一成一種,這樣用起來就很方便。其次對有限容量的channel進行了重寫(還記得上一期我們講的Deque其實就是為了消除Mutex產生的瓶頸麼,這裡也類似。對於1-3點:(在此之前我們先簡單講下如何創建crossbeam的channel)

創建channel

有限容量

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();

無限容量

use crossbeam_channel::unbounded;

// 創建一個無限容量的channel

let (s, r) = unbounded();

// 不會阻塞

for i in 0..1000 {

s.send(i).unwrap();

}

·

1 支持MPMC

現在終於不用笨拙地給Receiver端加鎖了~

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

所以現在可以把引用在線程間傳遞了

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分支處理超時等邏輯

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,敬請期待。

相關焦點

  • 【crossbeam系列】5 crossbeam-util和crossbeam-queue:一些實用的小東西
    這一次我們來介紹一下crossbeam-util和crossbeam-queue,中的一些東西和用法。
  • 蔡司Crossbeam Laser FIB-SEM數量級加快半導體封裝失效分析
    蔡司Crossbeam Laser FIB-SEM數量級加快半導體封裝失效分析 2020年02月12日 10:05作者:黃頁編輯:黃頁 蔡司Crossbeam
  • 蔡司(ZEISS)使用Crossbeam Laser FIB-SEM數量級加快半導體封裝...
    蔡司Crossbeam Laser將飛秒雷射、鎵離子聚焦離子束(FIB)和場發射掃描電鏡(SEM)整合於單一設備,提供針對特定位置的最快速橫截面工作流程本文引用地址:http://www.eepw.com.cn/article/202002/409800.htm加州普萊斯頓與德國奧博科亨,2020年2月4日--蔡司日前推出了針對特定位置的聚焦離子束掃描電鏡
  • 造輪子系列之beam search
    有了這個基本思路後,我們來看下代碼實現,代碼是OpenNMT-py,beam search 是用在predict階段,現在我們假設輸入的batch_size=3,然後length=4,輸入數據如下:encoder的輸入是 3x4,然後encoder會輸出 3*4*hidden_dim的隱狀態
  • Huawei beam是什麼 Huawei beam使用方法【圖文】
    很多人在使用華為手機時,會發現華為手機有一個Huawei beam的功能,那麼Huawei beam是什麼呢?Huawei beam怎麼用?下面來看看詳細介紹吧!  Huawei beam是什麼:   想要開啟華為手機的Huawei Beam,首先需要將裡面的NFC功能開啟,下拉動態欄,就可以在下拉框裡找到NFC圖標,點擊一下就可以使用了。
  • 你知道off beam是什麼意思嗎?
    對,可以用beam表示。今天,我們就一起看一下beam的用法。首先,我們看一下beam做名詞的用法。1、The car's headlights were on full beam.那輛汽車大開著前燈。這句話中bean的意思是光線、光束。雷射可以表達為a laser beam,一絲絲的光線可以表達為narrow beams of light。
  • LG發布Minibeam微型投影機
    LG發布了最新的Minibeam微型投影儀,可以任何地方顯示任何東西,無論是在現場商務演示或家庭影院的電影體驗等等。而隨著LED技術的不斷進步,用戶再也不用擔心燈泡燒得太早。事實上,LG發布了自己的LED單元,可以持續無故障工作30000小時。或10年每天8小時的使用時間。
  • Beam Search Decoder 解碼器
       t1    t2 a  0.2   0.4b  0.0   0.0-  0.8   0.6我們先從速度快、準確率低的Greedy Search Decoder講起,再敘述速度慢、但準確率高的Beam
  • JavaIO之:NIO中Channel的妙用
    最後飛機的航線,汽車的公路和火車的軌道就可以看做是一個個的channel。更多精彩內容且看:區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級帳本,以太坊,Libra,比特幣等持續更新Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新Spring 5.X系列教程:滿足你對Spring5的一切想像-持續更新java程式設計師從小工到專家成神之路(2020版
  • Mozilla發布可視化在線跟蹤工具Lightbeam
    日前,Mozilla發布了Firefox瀏覽器擴展組件Lightbeam,旨在幫助用戶理解並提供可視化的在線數據追蹤和分析功能。目前,該項目託管在GitHub上,基於MPL 2.0許可證下發行。
  • 斯坦·李新作Backchannel登陸美國排名第一漫畫平臺
    來源:中國財經時報網日前,隨著2018年紐約漫展的舉辦,全球最大的數字漫畫平臺Webtoon同步推出一系列的連載更新和新上線的漫畫,其中包括與承興國際控股(02662)旗下的斯坦·李POW! 娛樂公司合作的Backchannel系列。
  • Go channel 實現原理分析
    channel一個類型管道,通過它可以在goroutine之間發送和接收消息。它是Golang在語言層面提供的goroutine間的通信方式。眾所周知,Go依賴於稱為CSP(Communicating Sequential Processes)的並發模型,通過Channel實現這種同步模式。Go並發的核心哲學是不要通過共享內存進行通信; 相反,通過溝通分享記憶。
  • Netty組件之Channel實例化
    從以下子接口中可以看出Netty對不同的底層協議提供了對應的channel來處理,例如:TCP/IP、UDP/IP、SCTP/IP、HTTP2等。(NioSocketChannel.class);b.option(ChannelOption.SO_KEEPALIVE, true);b.remoteAddress(HOST, PORT);b.handler(initializer);Channel channel = b.connect().syncUninterruptibly().channel();Channel
  • Go判斷channel是否關閉
    本文介紹判斷channel是否關閉的方法。解決問題:如果不判斷channel是否關閉會產生死循環。channel添加關閉邏輯代碼演示:package mainimport ( &34;)func main() { c := make(chan int, 10) c <- 1 c <- 2 c <- 3 close(c)/* * close關閉了channel,依然可以使用For讀取到channel裡面的數據
  • go語言channel使用以及原理解析
    2.4 鎖一個channel同時僅允許被一個goroutine讀寫,為簡單起見,本章後續部分說明讀寫過程時不再涉及加鎖和解鎖。除此之外,panic出現的常見場景還有:關閉值為nil的channel關閉已經被關閉的channel向已經關閉的channel寫數據4.
  • 三星GALAXY BEAM售2460元
    【PConline香港站行情】  在茫茫的安卓機海中,三星 I8530(Galaxy beam) 無論是在配置上還是外觀上都不出彩,唯獨內置投影功能卻是安卓手機中非常稀有的,採用一塊4英寸屏幕,投影尺寸可達50英寸,外加配備了一塊2000毫安時的鋰電池,整體待機能力自然有著不錯的保證
  • Cisco ASA 防火牆 EtherChannel 配置案例
    配置 ASAciscoasa(config) channel-group1 mode active ciscoasa(config) channel-group 1 mode active ciscoasa(config-if) nameif TRUST ciscoasa(config-if) no sh配置 IOSSwitch(config)no switchport Switch(config-if-range
  • 三星GALAXY beam功能分析【圖文】
    GALAXY beam怎麼樣?目前在三星投影手機上面,最新款的當屬GALAXY beam。它是結合之前投影手機的特點進行改進的產品,從性能上與其他的投影手機有明顯的差異,也有諸多的不同。下面來詳細了解下GALAXY beam:   三星GALAXY beam  1、豐富的投影功能
  • go語言學習總結(四十八)深入理解 Go Channel
    goroutine 1 [chan receive (nil chan)]:main.main() /Users/kltao/code/go/examples/channl/channel1.go:11 +0x60goroutine 4 [chan send (nil chan)]:main.main.func1(0x0)2.2 channel
  • 「Go系列」 理解GO Routine 和 Channel
    什麼是channel?可以將通道視為Go routine 可以進行通信的媒介。可以使用通道發送或接收數據。通道中數據的接收或發送本質上是阻塞的。每個通道都有定義的類型。除已定義的數據類型外,其他數據類型均無法寫入或讀取。