国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Go 利用上下文進行并發計算,你學會了嗎?

開發
在測試中,我們期望 ??filterAll?? 會失敗,因為我們設置的超時時間只有一納秒。因此,上下文應該因為超過截止時間而發生錯誤。如果在啟動 Goroutine 進行下載內容過濾時不檢查 ??context.Err()??,我們將永遠不會處理此類錯誤。

在Go編程中,上下文(context)是一個非常重要的概念,它包含了與請求相關的信息,如截止日期和取消信息,以及在請求處理管道中傳遞的其他數據。在并發編程中,特別是在處理請求時,正確處理上下文可以確保我們尊重和執行請求中設定的限制,如截止時間。

讓我們通過一些代碼示例來探討如何在并發計算中使用上下文,以及如何在處理請求時尊重上下文所設定的截止日期和取消要求。

// download 函數用于下載給定 URL 的內容。
func download(ctx context.Context, url string) (string, error) {...}

download 函數嘗試獲取給定 URL 的內容。然而,需要注意的是,每個 URL 的下載內容可能不同,因此下載所需的時間也可能不同。如果在截止日期之前未能完成 URL 的下載,該函數將返回一個錯誤(截止日期錯誤)。

現在,假設我們需要下載許多 URL,并且我們只有有限的時間來完成這些下載。我們可以使用 errgroup 來并發地進行下載,如果超過截止時間,我們將取消所有并發操作。

// downloadAll 函數并發地下載給定 URL 的內容。
func downloadAll(ctx context.Context, urls []string) ([]string, error) {
  results := make([]string, len(urls))

  g, ctx := errgroup.WithContext(ctx)
  for i := range len(urls) {
    g.Go(func() error {
      content, err := download(ctx, urls[i])
      if err != nil {
        return err
      }

      results[i] = content
      return nil
    })
  }

  if err := g.Wait(); err != nil {
    return nil, err
  }

  return results, nil
}

在這個示例中,downloadAll 函數同時下載每個給定的 URL,并將相同的上下文傳遞給 download 函數。如果下載任何一個 URL 所需的時間超過了設定的截止時間,download 函數將失敗,從而導致整個并發流程也失敗,downloadAll 將返回一個截止日期錯誤。

除了下載這些 URL,我們還需要處理下載的內容。例如,我們可能要對每個 URL 的內容應用某個過濾器(謂詞)。

// filter 函數檢查給定內容是否符合給定的謂詞。
func filter(content string, pred func(string) bool) bool {
  return pred(content)
}

請注意,過濾器既不需要上下文,也不進行任何跨邊界調用。過濾器函數不關心上游處理的截止日期。

使用 filter 函數,我們可以定義一個過濾所有內容的函數。

// filterAll 函數同時過濾所有給定的內容。
func filterAll(contents []string, pred func(string) bool) []string {
  type Result struct {
    content string
    ok      bool
  }

  results := make([]Result, len(contents))

  g := errgroup.Group{}
  for i, content := range contents {
    g.Go(func() error {
      ok := filter(contents[i], pred)
      results[i] = Result{content: content, ok: ok}

      return nil
    })
  }

  g.Wait()

  var filtered []string
  for _, r := range results {
    if r.ok {
      filtered = append(filtered, r.content)
    }
  }

  return filtered
}

filterAll 函數調用 filter 函數來應用謂詞到每個內容上,但謂詞的應用可能會花費一些時間,可能超過上下文設置的截止時間。由于 filter 函數不使用上下文,因此它不會因為截止日期錯誤而失敗。

我們需要重新定義 filterAll,使其使用上下文并檢查其中的錯誤,而不管 filter 函數是否使用了上下文。

// filterAll 函數同時過濾所有內容,并檢查上下文中的錯誤。
func filterAll(ctx context.Context, contents []string, pred func(string) bool) ([]string, error) {
  type Result struct {
    content string
    ok      bool
  }

  results := make([]Result, len(contents))

  g, ctx := errgroup.WithContext(ctx)
  for i, content := range contents {
    g.Go(func() error {
      if err := ctx.Err(); err != nil {
        return err
      }

      ok := filter(contents[i], pred)
      results[i] = Result{content: content, ok: ok}

      return nil
    })
  }

  if err := g.Wait(); err != nil {
    return nil, err
  }

  var filtered []string
  for _, r := range results {
    if r.ok {
      filtered = append(filtered, r.content)
    }
  }

  return filtered, nil
}

我們的新實現 filterAll 函數會檢查上下文中的任何錯誤,即使上下文并未直接傳遞給下游函數(在本例中為 filter)。如果發生了與上下文相關的截止日期(或任何其他錯誤),整個過濾過程就會失敗。

現在,讓我們完成對所有內容的處理。

// processURLs 函數下載每個 URL 的內容并對其進行過濾。
//
// 處理必須在上下文截止日期內完成。
func processURLs(ctx context.Context, urls []string) ([]string, error) {
  contents, err := downloadAll(ctx, urls)
  if err != nil {
    return nil, err
  }

  filtered, err := filterAll(ctx, contents, somePredicate)

  return filtered, err
}

如果任何一個下載操作花費的時間過長,那么在嘗試獲取內容時就會發生截止日期錯誤,因為上下文被直接用于 API 調用。因此,downloadAll 函數也會失敗,進而導致 processURLs 失敗。

如果所有的 URL 在截止日期內都被正確下載,我們將繼

續對它們進行過濾。在對每個下載內容進行過濾時,不使用上下文,但 filterAll 函數明確地檢查上下文中的錯誤,如果發生了與上下文相關的截止日期(或任何其他錯誤),整個過濾過程就會失敗。

有時候,僅僅使用 errgroup.WithContext 是不足以檢測到上下文中的截止日期或其他問題的,特別是當上下文未直接使用時。因此,我們應該定期檢查是否仍在時間限制內,否則就會失敗。

最后,我們可以通過編寫 filterAll 的測試來確保我們正確地處理了類似的情況,以確保我們尊重與上下文相關的任何錯誤。

func TestContextError(t *testing.T) {
  ctx, done := context.WithTimeout(context.Background(), time.Nanosecond)
  defer done()

  // 生成我們想要應用過濾器的一些數據。
  var contents []string = testingContent()

  _, err := filterAll(ctx, contents, thePredicate)
  if err == nil {
    t.Errorf("filterAll() = %v, want error", err)
  }
}

請注意,在測試中,我們期望 filterAll 會失敗,因為我們設置的超時時間只有一納秒。因此,上下文應該因為超過截止時間而發生錯誤。如果在啟動 Goroutine 進行下載內容過濾時不檢查 context.Err(),我們將永遠不會處理此類錯誤。

責任編輯:武曉燕 來源: 愛發白日夢的后端
相關推薦

2025-02-26 00:16:56

RAGAI服務

2024-02-21 19:02:05

Go模板化方式

2017-05-11 14:00:02

Flask請求上下文應用上下文

2023-01-29 08:08:34

并發庫conc通用庫

2022-01-17 07:50:37

Go代碼規范

2023-04-26 00:41:36

A/B測試郵件數量

2022-08-29 08:05:44

Go類型JSON

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2025-06-20 09:57:42

2021-07-26 07:47:36

Cpu上下文進程

2023-06-26 08:02:34

JSR重排序volatile

2024-03-18 08:06:59

JavaGo開發

2024-01-19 08:25:38

死鎖Java通信

2023-07-26 13:11:21

ChatGPT平臺工具

2024-02-04 00:00:00

Effect數據組件

2023-01-10 08:43:15

定義DDD架構

2024-01-26 06:05:16

KuberneteseBPF網絡

2024-05-30 09:43:00

2022-07-13 08:16:49

RocketMQRPC日志
點贊
收藏

51CTO技術棧公眾號

欧美一级免费大片| 美女视频久久黄| 综合操久久久| 97色婷婷成人综合在线观看| 国产日产欧美精品一区二区三区| 在线视频欧美日韩精品| 在线影视一区| 成人性生交大片免费看中文网站| 色诱女教师一区二区三区| 调教视频vk| 在线亚洲免费| 成人免费大片黄在线播放| 成人免费直播| 亚洲免费观看高清完整版在线观看 | 91久久免费观看| 色一情一区二区三区四区 | 中文字幕一区二区三区av| 男女曰b免费视频| 久久电影网站中文字幕| 91国内产香蕉| 制服丝袜中文字幕在线| 欧美三级视频在线播放| 六月丁香激情网| 久久爱www久久做| 日本午夜人人精品| 川上优av中文字幕一区二区| 成人综合在线网站| 国产精品www在线观看| 国内外成人在线| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产精品嫩草影院在线看| 一级日本不卡的影视| 欧美性大战久久久久xxx| 免费亚洲电影在线| 91精品国产精品| 不卡av免费在线| av在线播放成人| 欧美日韩一区二| 欧美全黄视频| 久久久久久久香蕉网| 国产在线视频综合| 男女激情视频一区| 亚洲a∨一区二区三区| 成人情趣视频网站| 欧美成人午夜剧场免费观看| 国产一级片在线播放| 亚洲视频一区二区在线观看| 91精品综合视频| 中日韩男男gay无套| 久久久水蜜桃| 久久大逼视频| 成人乱人伦精品视频在线观看| 成人爽a毛片一区二区免费| r级无码视频在线观看| 久久久久久久久久久黄色| 男人的天堂狠狠干| 日本一区二区不卡视频| 妞干网这里只有精品| 亚洲欧洲99久久| 最新天堂资源在线资源| 制服.丝袜.亚洲.中文.综合| 国产丝袜精品丝袜| 精品一区二区亚洲| 91天堂在线| 精品美女在线播放| 欧美18xxxx| 国产日韩欧美亚洲一区| 99亚洲一区二区| 在线免费观看h| 在线观看亚洲视频| 亚洲成人毛片| 国产欧美日韩视频一区二区三区| 日韩视频在线一区二区三区| 秋霞毛片久久久久久久久| 久久久99精品免费观看| 快色在线观看| 精品国产乱码久久久久久图片 | 欧美另类自拍| 亚洲精品国产精品国自产在线| 综合伊思人在钱三区| 99国产高清| 精品一区二区三区久久| 日韩av黄色网址| 精品中文字幕久久久久久| 欧美亚洲国产激情| 男人天堂a在线| 欧美精品aⅴ在线视频| 99亚洲一区二区| 日本天堂在线| 在线电影av不卡网址| 91精品一区国产高清在线gif | 久久蜜桃av一区精品变态类天堂| 欧美日韩尤物久久| 男女啪啪网站视频| 国产精品一区=区| 中文av一区二区| 日韩欧美中文字幕电影| 樱桃视频免费看| 成人福利网站在线观看| 欧美又粗又大又爽| 日韩精品一区第一页| 久久91导航| 污视频网站免费| 成人午夜在线观看| 日韩一区二区三区三四区视频在线观看| 欧美成人嫩草网站| 国产美女情趣调教h一区二区| 91免费在线视频网站| 亚洲国产日韩一区| 久久久久国产成人精品亚洲午夜| 亚洲午夜免费| 日本最黄一级片免费在线| 欧美黑人在线观看| 国产精品视频专区| 91精品国产麻豆| 99国内精品久久| 欧美欧美天天天天操| 国产精品四虎| xxxx一级片| 污视频在线免费观看一区二区三区| 日韩视频免费在线| 欧美综合一区二区三区| 经典三级在线一区| 男女视频一区二区| 老司机精品福利视频| 九九综合久久| 台湾佬中文娱乐久久久| mm1313亚洲国产精品美女| 98在线视频| 黄av在线播放| 国产精品25p| 成人毛片免费| 在线观看亚洲视频啊啊啊啊| 国产精品成人在线| 欧美精品成人在线| 精品国产一区二区在线| 亚洲人成自拍网站| 亚洲视频在线视频| 欧美mv和日韩mv国产网站| 亚洲一区影音先锋| 亚洲蜜桃精久久久久久久| 久久久综合视频| 国产精品高潮呻吟久久| 日本一区二区动态图| 国产精品久久久久久久岛一牛影视| 久久综合九色综合97婷婷女人| 北岛玲一区二区三区四区| 狠狠色丁香婷婷综合| av在线不卡电影| 久久久蜜桃精品| 亚洲国产日韩一区二区| 欧美性猛交xxxx久久久| 日韩一级高清毛片| 国产亚洲美女精品久久久| 国产一区二区三区在线免费观看| 国产在线日韩欧美| 欧美三级日韩在线| 久久字幕精品一区| 91综合网人人| 免费黄网站在线播放| 中文字幕无码精品亚洲资源网久久| 久久99精品久久久久久青青日本 | 国产激情视频一区二区在线观看| 亚洲国产精品日韩专区av有中文| 欧美激情偷拍自拍| 黄色在线一区| av午夜精品一区二区三区| 欧美激情在线一区二区三区| 99久久99精品久久久久久| 精品一区二区三区在线视频| 天堂午夜影视日韩欧美一区二区| 99精品桃花视频在线观看| 亚洲一区在线观看免费| 91精品国产综合久久精品性色| 久久综合久久美利坚合众国| 国产日韩精品在线播放| 精选一区二区三区四区五区| 欧美日韩中文字幕在线播放| 窝窝九色成人影院| 91精品久久| 国产一区二区三区四区五区传媒| 久久99精品国产麻豆不卡| 成人高清伦理免费影院在线观看| 玉米视频成人免费看| 精品国产乱码久久久久久久| 久久久亚洲网站| 在线观看欧美一区| 四虎精品在线| 成人激情久久| 国产在线视频精品一区| 亚洲男人的天堂av| 在线观看亚洲成人| 久久精品国产欧美激情| 九9re精品视频在线观看re6| а√最新版地址在线天堂| 国产视频网站一区二区三区| 久久www成人_看片免费不卡| 午夜精品123| 欧美国产日韩一区| wwwjizzjizzcom|