为了账号安全,请及时绑定邮箱和手机立即绑定

搭建并行处理管道,感受GO语言魅力

难度中级
时长 2小时17分
学习人数
综合评分9.67
51人评价 查看评价
9.9 内容实用
9.5 简洁易懂
9.6 逻辑清晰
  • func ReadSource(reader io.Reader) <-chan int {
       out := make(chan int)
       go func() {
          buffer := make([]byte, 8)
          for  {
             n, err := reader.Read(buffer)
             if n > 0 {
                v := int(binary.BigEndian.Uint64(buffer))
                out <- v
             }
             if err != nil {
                break
             }
          }
          close(out)
       }()
       return out
    }
    
    func WriteSink(writer io.Writer, in <-chan int)  {
       for v := range in {
          buffer := make([]byte, 8)
          binary.BigEndian.PutUint64(buffer, uint64(v))
          writer.Write(buffer)
       }
    }
    
    func RandomSource(count int) <-chan int{
       out := make(chan int)
       go func() {
          for i := 0; i < count; i++ {
             out <- rand.Int()
          }
          close(out)
       }()
       return out
    }
    func main() {
       const filename = "large.in"
       const n = 100000000
       file, err := os.Create(filename)
       if err != nil {
          panic(err)
       }
       defer file.Close()
    
       p := pipeline.RandomSource(n)
       writer := bufio.NewWriter(file)
       pipeline.WriteSink(writer, p)
       writer.Flush()
    
       file, err = os.Open(filename)
       if err != nil {
          panic(err)
       }
       defer file.Close()
    
       p = pipeline.ReadSource(bufio.NewReader(file))
       count := 0
       for v := range p {
          fmt.Println(v)
          count++
          if count >= 100 {
             break
          }
       }
    }


    查看全部
    2 采集 收起 来源:文件读写

    2020-07-26

  • package pipeline
    
    import (
       "encoding/binary"
       "io"
       "sort"
    )
    
    func  ArraySource(a ...int) <-chan int {
       out := make(chan int)
       go func() {
          for _, v := range a{
             out <- v
          }
          close(out)
       }()
       return out
    }
    
    func InMemSort(in <-chan int) <-chan int {
       out := make(chan int)
       go func() {
          // Read into memory
          var a []int
          for v := range in {
             a = append(a, v)
          }
    
          // Sort
          sort.Ints(a)
    
          // Output
          for _, v := range a {
             out <- v
          }
          close(out)
       }()
       return out
    }
    
    func Merge(in1, in2 <-chan int) <-chan int {
       out := make(chan int)
       go func() {
          v1, ok1 := <-in1
          v2, ok2 := <-in2
          for ok1 || ok2 {
             if !ok2 || (ok1 && v1 <= v2) {
                out <- v1
                v1, ok1 = <-in1
             } else {
                out <- v2
                v2, ok2 = <-in2
             }
          }
          close(out)
       }()
       return out
    }
    package main
    
    import (
       "ccmouse/gointro/pipeline"
       "fmt"
    )
    
    func main() {
       p := pipeline.Merge(
          pipeline.InMemSort(
             pipeline.ArraySource(3, 2, 6, 7, 4)),
          pipeline.InMemSort(
             pipeline.ArraySource(7, 4, 0, 3, 2, 13, 8)))
       for v := range p {
          fmt.Println(v)
       }
    }


    查看全部
    0 采集 收起 来源:归并节点

    2020-07-26

  • 一些节点

    • 数组数据源节点- channel 的关闭及检测

    • 内部排序节点

    • 归并节点


    查看全部
    0 采集 收起 来源:归并节点

    2020-07-26

  • 外部排序 Pipeline

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • 节点的组装

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • 节点多输入和多输出

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • Pipeline

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • 外部排序归并节点

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • 外部排序切分

    查看全部
    0 采集 收起 来源:归并排序算法

    2022-07-23

  • 将数据分为左右两半,分别归并排序,再把两个有序数据归并

    如何归并:

    • [1, 3, 6, 7], [1, 2, 3, 5] → 1

    • [3, 6, 7],[1, 2, 3, 5]   → 1

    • [3, 6, 7], [2, 3, 5]        → 2

    • [3,6,7],[3, 5]            → 3

    • ……


    查看全部
    0 采集 收起 来源:归并排序算法

    2020-07-26

  • package main
    
    import (
       "fmt"
       "sort"
    )
    
    func main() {
       // create a slice of int
       a := []int{3, 6, 2, 1, 9, 10,8}
       sort.Ints(a)
    
       for _, v := range a {
          fmt.Println(v)
       }
    }


    查看全部
    0 采集 收起 来源:内部排序示例

    2020-07-25

  • package main
    
    import (
       "fmt"
    )
    
    func main() {
       ch := make(chan string)
    
       for i:=0; i < 5000; i++ {
          // go starts a goroutine
          go printHelloWorld(i, ch)
       }
    
       for  {
          msg := <- ch
          fmt.Println(msg)
       }
    }
    
    func printHelloWorld(i int, ch chan string) {
       for  {
          ch <- fmt.Sprintf("Hello world from go routine %d!\n", i)
       }
    }


    查看全部
  • package main
    
    import (
       "fmt"
       "net/http"
    )
    
    func main() {
       http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
          fmt.Fprintf(writer, "<h1>Hello World %s!<h1>", request.FormValue("name"))
       })
    
       http.ListenAndServe(":8888", nil)
    }


    查看全部
  • Hello World

    • 普通 Hello World

    • Hello World Server - 读取 url 中的参数

    • 并发 Hello World - 初识 goroutine 与 channel

    • 一个简单的排序


    查看全部
  • Hello World

    • 普通 Hello World

    • Hello World Server - 读取 url 中的参数


    查看全部

举报

0/150
提交
取消
课程须知
1、了解一门编程语言,对基本算法如排序有了解
老师告诉你能学到什么?
1、go语言的历史和设计初衷 2、go语言的安装与开发环境 3、简单的go语言程序 4、了解go语言并发编程 5、实现一个并行数据处理管道

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!