• go countdown


    1. 倒计时countdown

    例子还是来自go programing language。基本上是对time.Tick 加select的简单应用。

    2.countdown 1

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func main() {
    	fmt.Println("commencing countdown.")
    	tick := time.Tick(1 * time.Second)
    	for countdown := 10; countdown > 0; countdown-- {
    		fmt.Println(countdown)
    		<-tick
    	}
    	//launch()
    
    }
    
    

    一个倒数程序,里面的关键是tick := time.Tick(1*time.second) ,这个tick每1秒产生一个channel,在for里循环调用即可,<-tick没收到channel会阻塞。

    3. countdown2 ,带cancel。

    package main
    
    import (
    	"fmt"
    	"os"
    	"time"
    )
    
    func main() {
    	fmt.Println("commencing down")
    	//tick:=time.Tick(1*time.Second)
    	abort := make(chan struct{})
    	go func() {
    		os.Stdin.Read(make([]byte, 1))
    		abort <- struct{}{}
    	}()
    
    	select {
    	case <-time.After(10 * time.Second):
    
    	case <-abort:
    		fmt.Println("lauch aborted!")
    		return
    	}
    
    }
    		
    

    如果要取消,就需要增加一个channel,这样就需要select-case来处理这种情况。以上是abort在time.After之前触发就会直接return。

    4.countdown

    package main
    
    import (
    	"fmt"
    	"os"
    	"time"
    )
    
    func main() {
    	fmt.Println("commencing down")
    	tick := time.Tick(1 * time.Second)
    	abort := make(chan struct{})
    	go func() {
    		os.Stdin.Read(make([]byte, 1))
    		abort <- struct{}{}
    	}()
    	for countdown := 10; countdown > 0; countdown-- {
    		fmt.Println(countdown)
    		select {
    		case <-tick:
    
    		case <-abort:
    			fmt.Println("lauch aborted!")
    			return
    		}
    	}
    
    }
    
    

    第三个是用回tick ,不用time.After了。

    tick非常好用,但是想对他生命周期进行管理,就需要NewTicker

    ticker := time.NewTicker(1*time.Second)
    <- ticker.C
    ticker.Stop()
    

    这样可以stop 这个ticker。

    默认的time.Ticker()

    // Tick is a convenience wrapper for NewTicker providing access to the ticking
    // channel only. While Tick is useful for clients that have no need to shut down
    // the Ticker, be aware that without a way to shut it down the underlying
    // Ticker cannot be recovered by the garbage collector; it "leaks".
    // Unlike NewTicker, Tick will return nil if d <= 0.
    func Tick(d Duration) <-chan Time {
    	if d <= 0 {
    		return nil
    	}
    	return NewTicker(d).C
    }
    

    time.Tick就是对time.NewTicker的简单封装。返回channel,并不能stop,对时间进行了判断小于0就返回nil。

  • 相关阅读:
    save html to local
    Django REST framework¶
    a colorful termial output for phantomjs porting from casperjs
    jespern / djangopiston / wiki / Documentation — Bitbucket
    PyKHTML, a Python interface to KHTML
    phantomjs/examples/echoToFile.js at master · ariya/phantomjs
    Scraping multiple sites in parallel and memory consumption Google Groups
    jQuery Arrays | Create, Add To, Remove From and Compare
    They're hiring based on New Brunswick, NJ, USA
    FudanNLP  java based
  • 原文地址:https://www.cnblogs.com/gqdw/p/13064183.html
Copyright © 2020-2023  润新知