好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > golang并發下載多個文件的方法

golang并發下載多個文件的方法

熱門標簽:南通如皋申請開通400電話 高德地圖標注口訣 廣州呼叫中心外呼系統 中國地圖標注省會高清 西部云谷一期地圖標注 浙江高速公路地圖標注 學海導航地圖標注 江西轉化率高的羿智云外呼系統 地圖標注的汽車標

背景說明

假設有一個分布式文件系統,現需要從該系統中并發下載一部分文件到本地機器。

已知該文件系統的部分節點ip, 以及需要下載的文件fileID列表,并能通過這些信息來拼接下載地址。

其中節點ip列表保存在xx_node.txt, 要下載的fileID保存在xx_fileID.txt中。

代碼示例

package main

import (
  "bufio"
  "flag"
  "fmt"
  "io"
  "math/rand"
  "net/http"
  "os"
  "time"
)

var (
  clustername = flag.String("clustername", "c1", "download clustername")
)

// 逐行讀取文件內容
func ReadLines(fpath string) []string {
  fd, err := os.Open(fpath)
  if err != nil {
    panic(err)
  }
  defer fd.Close()

  var lines []string
  scanner := bufio.NewScanner(fd)
  for scanner.Scan() {
    lines = append(lines, scanner.Text())
  }
  if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, err)
  }

  return lines
}

// 實現單個文件的下載
func Download(clustername string, node string, fileID string) string {
  nt := time.Now().Format("2006-01-02 15:04:05")
  fmt.Printf("[%s]To download %s\n", nt, fileID)

  url := fmt.Sprintf("http://%s/file/%s", node, fileID)
  fpath := fmt.Sprintf("/yourpath/download/%s_%s", clustername, fileID)
  newFile, err := os.Create(fpath)
  if err != nil {
    fmt.Println(err.Error())
    return "process failed for " + fileID
  }
  defer newFile.Close()

  client := http.Client{Timeout: 900 * time.Second}
  resp, err := client.Get(url)
  defer resp.Body.Close()

  _, err = io.Copy(newFile, resp.Body)
  if err != nil {
    fmt.Println(err.Error())
  }
  return fileID
}

func main() {
  flag.Parse()

  // 從文件中讀取節點ip列表
  nodelist := ReadLines(fmt.Sprintf("%s_node.txt", *clustername))
  if len(nodelist) == 0 {
    return
  }

  // 從文件中讀取待下載的文件ID列表
  fileIDlist := ReadLines(fmt.Sprintf("%s_fileID.txt", *clustername))
  if len(fileIDlist) == 0 {
    return
  }

  ch := make(chan string)

  // 每個goroutine處理一個文件的下載
  r := rand.New(rand.NewSource(time.Now().UnixNano()))
  for _, fileID := range fileIDlist {
    node := nodelist[r.Intn(len(nodelist))]
    go func(node, fileID string) {
      ch - Download(*clustername, node, fileID)
    }(node, fileID)
  }

  // 等待每個文件下載的完成,并檢查超時
  timeout := time.After(900 * time.Second)
  for idx := 0; idx  len(fileIDlist); idx++ {
    select {
    case res := -ch:
      nt := time.Now().Format("2006-01-02 15:04:05")
      fmt.Printf("[%s]Finish download %s\n", nt, res)
    case -timeout:
      fmt.Println("Timeout...")
      break
    }
  }
}

小結

下載時沒有用到默認的http Client, 并指定了超時時間;

下載文件時調用了系統調用, goroutine會被掛起;

下載文件完成后會喚醒被掛起的goroutine, 該goroutine執行完后面的代碼后便退出;

全局超時控制,超時后主線程退出。

以上這篇golang并發下載多個文件的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • golang語言實現的文件上傳與文件下載功能示例
  • Golang實現異步上傳文件支持進度條查詢的方法
  • Golang+Android基于HttpURLConnection實現的文件上傳功能示例
  • golang簡單獲取上傳文件大小的實現代碼
  • 如何使用大學教育郵箱下載golang等軟件(推薦)
  • 解決 Golang VS Code 插件下載安裝失敗的問題
  • golang實現http server提供文件下載功能
  • Golang 使用http Client下載文件的實現方法
  • 下載golang.org/x包的操作方法
  • golang實現的文件上傳下載小工具

標簽:貴州 曲靖 吐魯番 許昌 保定 東營 德宏 常州

巨人網絡通訊聲明:本文標題《golang并發下載多個文件的方法》,本文關鍵詞  golang,并發,下載,多個,文件,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang并發下載多個文件的方法》相關的同類信息!
  • 本頁收集關于golang并發下載多個文件的方法的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 校花被?娇喘出奶视频| 性做久久久久免费看| 亚洲成人av| 91国精产品自偷自偷2023| 疯狂伦交1一6小说| 亚洲日日操| 国产精品18久久久久久不卡| OVA催●性指导3~乳辱の教室| 国产精品免费无遮挡无码永久视频| 短裙公车被强好爽H刘晓莉| 天天操操操| 日本a级大片| 极速影院在线观看| 韩国无遮挡羞羞漫画大全| 小浪货腿张开水好多呀H漫画| h激情小说| 蜜臀av无码久久精品色欲动图| 十七种性幻想漫画| 国外钢针穿乳虐乳视频| 51电影院| 51社区精品视频在线观看高清| 野外露营高H辣文| 我要看日批视频| 天天躁夜夜躁狂狂躁综合| 激情电影在线| 扒开纲手?狂揉?难受3d| 三级黄页| wwwsss日本| Bungie新作GummyBears曝光| 年轻女教师hd中字3D| e80e理论片手机| 亚洲午夜精品| 丝袜hd| 国产做受18~20岁A片潘金莲| 一本大道AV片加勒比无码| 打扑克的视频软件下载安装| 夜色撩人网永久地址| 免费一级毛片不卡不收费| 1024手机看片人妻人伦电影网| 太深?拔出来?痛太舒a两男一女| 日本亲胸吃奶大视频|