时间:2019-11-09 09:47  编辑:admin

利用goroutine

func echo(r io.Reader, w io.Writer) {
    io.Copy(w, r)
}

func main() {
    go echo(os.Stdin, os.Stdout)
    time.Sleep(30 * time.Second)
    fmt.Println("timeout!")
    os.Exit(0)
}

利用goroutine闭包

func main() {
    fmt.Println("main goroutine.")
    // 那里的藏名函数没有1定甚么时分实行
    go func() {
        fmt.Println("main.func1 goroutine.")
    }()
    fmt.Println("main goroutine again.")
    // 自动让出工夫
    runtime.Drupal8sched()
}

守候goroutine

func compress(filename string) error {
    in, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer in.Close()
    out, err := os.Create(filename + ".gz")
    if err != nil {
        return err
    }
    defer out.Close()
    gzout := gzip.NewWriter(out)
    _, err = io.Copy(gzout, in)
    gzout.Close()
    return err
}

func main() {
    var wg sync.WaitGroup

    var i int = ⑴
    var file string
    for i, file = range os.Args[1:] {
        // 利用wg去守候goroutine
        wg.Add(1)
        // 闭包创立链式挪用 藏名函数的参数是中部自在变量 
        // 假如没有给参数内部compress将利用file的轮回最初的值
        // 1个轮回中利用goroutine时 要注重goroutine利用的变量
        // 是不是被for轮回改动了 最简朴的圆法便是轮回内复造变量
        go func(filename string) {
            compress(filename)
            wg.Done()
        }(file)
    }
    wg.Wait()
    fmt.Printf("Compressed %d files\n", i+1)
}

互斥锁

type words struct {
    // 多个goroutine保护1个map 必要对map减锁
    // TODU:golang bible chapter 9
    sync.Mutex
    found map[string]int
}

func newWords() *words {
    return &words{found: map[string]int{}}
}

func (w *words) add(word string, n int) {
    w.Lock()
    defer w.Unlock()
    count, ok := w.found[word]
    if !ok {
        w.found[word] = n
    }
    w.found[word] = count + n
}

func tallyWords(filename string, dict *words) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    scanner := bufio.NewScanner(file)
    scanner.Split(bufio.ScanWords)
    for scanner.Scan() {
        word := strings.ToLower(scanner.Text())
        dict.add(word, 1)
    }
    return scanner.Err()
}

func main() {
    var wg sync.WaitGroup
    w := newWords()
    for _, f := range os.Args[1:] {
        wg.Add(1)
        go func(filename string) {
            if err := tallyWords(filename, w); err != nil {
                fmt.Println(err.Error())
            }
            wg.Done()
        }(f)
    }
    wg.Wait()
    fmt.Println("words that appear more than once.")
    w.Lock()
    for word, count := range w.found {
        if count > 1 {
            fmt.Printf("%s:%d\n", word, count)
        }
    }
    w.Unlock()

}

标签: Drupal 中文  

Drupal安全更新

亚艾元软件以Drupal为基础,推动Drupal的中国化、Drupal教程中文化、将Drupal与微信相结合,服务广大的中国Drupal用户。

最近Drupal安全升级频繁,亚艾元提醒Drupal用户,及时升级安全补丁。


业务联系:崔克俊
手机: 13381113196
QQ: 372948992
公司电话:010-62669785

亚艾元象棋谱


亚艾元象棋谱,是亚艾元软件的一个实验项
目,以中国象棋棋谱为实例,用来探索最新
的Drupal网站开发、微信公众号开发、微信
公小程序开发、APP开发相关技术