1. 程式人生 > >在.NET Core中使用Channel(三)

在.NET Core中使用Channel(三)

到目前為止,我們一直在使用所謂的“Unbounded”通道。你會注意到,當我們建立通道時,我們這樣做:

var myChannel = Channel.CreateUnbounded<int>();

但實際上,我們可以這樣做:

var myChannel = Channel.CreateBounded<int>(1000);

這與建立容量有限的列表或陣列等其他集合型別並無太大差別。在我們的示例中,我們建立了一個最多容納1000項的Channel。但為什麼要限制自己呢?這就是背壓的作用。

什麼是背壓?

背壓(特別是當涉及訊息傳遞/排隊時)是指資源(無論是記憶體、ram、網路)是有限的。我們應該能夠在鏈條上施加“壓力”,試著減輕一些壓力。至少,讓生態系統中的其他人知道我們負荷過重,我們可能需要一些時間來處理他們的請求。

一般來說,當我們討論佇列的背壓時。幾乎所有情況下,我們都在討論一種方法,告訴任何試圖在佇列中新增更多條目的人,要麼他們根本無法再加入任何條目,要麼他們需要推後一段時間。更罕見的是,我們討論的佇列是在達到一定容量時純粹丟棄訊息。這種情況很少發生,但是我們有這個選項。

那麼它是如何與.net Channel一起工作的呢?

Channel中的背壓

當使用通道時,我們實際上有一個非常簡單的方法來增加背壓。程式碼看起來是這樣的:

var channelOptions = new BoundedChannelOptions(5)
{
    FullMode = BoundedChannelFullMode.Wait
};

var myChannel = Channel.CreateBounded<int>(channelOptions);

我們可以指定以下完整模式:

等待

在開啟WriteAsync()呼叫之前,只需讓呼叫者等待。

DropNewest / DropOldest

可以在Channel中拖放最老的或最新的專案,為我們想要新增的項騰出空間。

DropWrite

簡單地轉儲我們應該寫的訊息。

還有另外兩段程式碼需要注意。

你可以呼叫WaitToWriteAsync():

await myChannel.Writer.WaitToWriteAsync();

這讓我們Channel成了有界。當Channel已滿時,我們可以簡單地等待,直到有空間。這意味著,即使打開了DropWrite FullMode,我們也可以通過簡單地等待,直到有容量為止,來限制扔在地面上的訊息數量。

我們應該注意的另一段程式碼是:

var success = myChannel.Writer.TryWrite(i);

這允許我們嘗試寫入佇列,並返回,無論成功與否。需要注意的是,此方法不是非同步的。要麼寫入通道要麼不寫入通道,這裡沒有"如果你再多等一會兒,也許可以。”

 歡迎關注我的公眾號,如果你有喜歡的外文技術文章,可以通過公眾號留言推薦給我。

原文連結:https://dotnetcoretutorials.com/2020/11/24/using-channels-in-net-core-part-3-understanding-back-pressure/