成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Go 語言開發(fā)一個并發(fā)文件下載器

開發(fā) 后端
Go 語言是一門了不起的語言,盡管它非常簡單,與 Koltin 和 Scala 等其他現(xiàn)代語言相比,它的功能很少,但它具有強大的并發(fā)能力。這篇文章,我們將會看到使用 Go 語言如何編寫一個完整的并發(fā)文件下載器。

[[421486]]

本文轉(zhuǎn)載自微信公眾號「Golang來啦」,作者Seekload。轉(zhuǎn)載本文請聯(lián)系Golang來啦公眾號。

今天給大家分享一個實戰(zhàn)項目,涉及到的知識點還挺多,文末也有源碼地址!!

原文如下:

Go 語言是一門了不起的語言,盡管它非常簡單,與 Koltin 和 Scala 等其他現(xiàn)代語言相比,它的功能很少,但它具有強大的并發(fā)能力。這篇文章,我們將會看到使用 Go 語言如何編寫一個完整的并發(fā)文件下載器。完整的代碼在這里[1]。

檢查服務(wù)器是否支持并發(fā)下載

如何之前使用過類似 IDM 的下載工具,你可能會注意到它支持并發(fā)下載文件。

可以看到下載文件的時候啟動了 8 個進程。

實現(xiàn)并發(fā)下載,我們必須確保服務(wù)器支持范圍請求。怎么確認呢?我們可以發(fā)送 HEAD 請求,如果響應(yīng)頭的 Accept-Ranges 返回的值是 bytes,我們就能確定服務(wù)器支持此功能。

  1. res, err := http.Head("http://some.domain/some.file"
  2. if err != nil { 
  3.    log.Fatal(err) 
  4.  
  5. if res.StatusCode == http.StatusOK && res.Header.Get("Accept-Ranges") == "bytes" { 
  6.    // Yeh, server supports partial request 

如何下載文件的其中一部分

設(shè)想服務(wù)器支持范圍請求,我們知道文件大小是 4000 字節(jié)(文件大小從響應(yīng)頭的 Content-Length 獲取)。要僅下載 2000 到 3000 字節(jié)的文件的一部分,我們可以發(fā)送 HTTP GET 請求,并在 header 頭設(shè)置 Range 參數(shù):

  1. curl -X GET -H "Range: bytes=2000-3000" -o OUTPUT_FILE http://some.domain/some.file 

實現(xiàn)相同功能的代碼如下:

  1. req, err := http.NewRequest("GET""http://some.domain/some.file", nil) 
  2. if err != nil { 
  3.     log.Fatal(err) 
  4. rangeStart := 2000 
  5. rangeStop := 3000 
  6. req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", rangeStart, rangeStop)) 
  7.  
  8. // make a request 
  9. res, err := http.DefaultClient.Do(req) 

將響應(yīng)保存在文件中

為了支持斷點續(xù)傳功能,我們不會將請求響應(yīng)保存在內(nèi)存里,而是會持久化在文件中。舉個例子,如果我們把并發(fā)級別設(shè)置成 4,在輸出目錄將會有 4 個臨時文件。下面的代碼,我們只是簡單地讀取 HTTP 響應(yīng)體并將它寫入一個文件中:

  1. f, err := os.OpenFile(outputPath, flags, 0644) 
  2.     if err != nil { 
  3.         log.Fatal(err) 
  4.     } 
  5. defer f.Close() 
  6.  
  7. _, err = io.Copy(f, res.Body) 

暫停下載

不知道大家注意到?jīng)]有,上面代碼有個問題,使用時不支持 CTRL+C 暫停下載。如果下載的文件過大,或者網(wǎng)絡(luò)慢,下載需要花費很長時間。因為 io.Copy 復(fù)制文件時遇到 EOF 或者發(fā)生錯誤才結(jié)束。為了解決這個問題,我們使用 io.CopyN 和 cancel channel 組合:

  1. // copy to output file 
  2. for { 
  3.   select { 
  4.     case <- context.Done(): 
  5.        // user canceled the download 
  6.         return 
  7.     default
  8.       _, err = io.CopyN(f, res.Body, BUFFER_SIZE)) 
  9.       if err != nil { 
  10.         if err == io.EOF { 
  11.             return 
  12.         } else { 
  13.             log.Fatal(err) 
  14.         } 
  15.       } 
  16.     } 
  17.   } 

其他功能參見完整源代碼

這篇文章只提到了代碼中最重要的部分,但是通過閱讀代碼你可以了解其他功能是怎么實現(xiàn)的,比如:進度條的工作方式、如何使用 sync 包實現(xiàn)部分下載的同步、如何合并臨時文件以及如何實現(xiàn)恢復(fù)功能等。所以可以通過閱讀倉庫代碼[2]獲取更多信息。

參考資料

[1]這里: https://github.com/mostafa-asg/go-dl

[2]倉庫代碼: https://github.com/mostafa-asg/go-dl

via:

https://returnfn.com/lets-build-a-concurrent-file-downloader-in-go

作者:Mostafa Asgari

 

責(zé)任編輯:武曉燕 來源: Golang來啦
相關(guān)推薦

2021-07-05 10:33:55

開發(fā)技能Go

2023-04-03 06:53:04

Go開發(fā)架構(gòu)

2024-05-09 10:26:14

2022-01-05 08:58:08

Python解釋器編程語言

2021-01-14 09:49:10

安全漏洞開發(fā)

2015-10-12 15:50:07

PaaS云平臺開發(fā)go

2021-02-25 22:17:19

開發(fā)技術(shù)編程

2014-04-09 09:32:24

Go并發(fā)

2023-03-05 23:11:07

Go語言服務(wù)

2017-11-14 11:12:50

Go語言編譯器

2021-06-24 06:35:00

Go語言進程

2019-07-05 08:39:39

GoSQL解析器

2023-12-21 07:09:32

Go語言任務(wù)

2021-07-30 07:28:15

WorkerPoolGo語言

2024-01-08 13:40:00

并發(fā)安全? 數(shù)量

2021-07-26 10:14:38

Go語言工具

2013-05-28 09:43:38

GoGo語言并發(fā)模式

2021-07-15 23:18:48

Go語言并發(fā)

2023-02-10 09:40:36

Go語言并發(fā)

2021-04-13 06:35:13

Elixir語言編程語言軟件開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩免费一区二区 | 国产成人99久久亚洲综合精品 | 天堂亚洲 | 国产精品久久久久影院色老大 | 99在线免费视频 | 91嫩草精品| 国产欧美视频一区二区三区 | 欧美午夜精品 | 欧美激情一区二区三区 | 中文字幕乱码一区二区三区 | 日韩免费看片 | 欧美videosex性极品hd | 日韩欧美精品在线 | 欧美一级高潮片免费的 | 亚洲一区视频 | 久久免费视频1 | 亚洲三级国产 | 一区日韩| 黄色电影在线免费观看 | 亚洲第一天堂无码专区 | 欧美日韩在线观看视频网站 | 在线观看黄色电影 | 国产日韩欧美二区 | 久久久久久网 | 国产精品99久久久久久动医院 | 亚洲精品9999 | 亚洲综合成人网 | 午夜影院在线观看 | 久久久久久亚洲精品不卡 | 亚洲一区视频 | 国产精品久久久久免费 | 中文字幕高清在线 | 国产精品久久久久无码av | 国产精品99久久久久久大便 | 在线观看免费观看在线91 | 亚洲免费精品一区 | 午夜在线免费观看 | 无码一区二区三区视频 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 久久久久亚洲 | 国内久久精品 |