go 的 time ticker 设置定时器,比较诡异……

zihunqingxin · · 8521 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

上示例

package main

import (
    //    "bytes"
    //    "encoding/json"
    "fmt"
    //    "os"
    //    "gopkg.in/mgo.v2"
    //    "gopkg.in/mgo.v2/bson"
    //    "io/ioutil"
    //    "net/http"
    //    "strings"
    //    "net/url"
    "time"
)

func main() {
    ticker := time.NewTicker(10 * time.Second)
    for i := 0; i < 10; i++ {
        time := <-ticker.C
        fmt.Println(time.String())
    }
}

执行结果

wifimac:webdemo cdpmac$  go run src/server/timetest.go 

2015-08-24 16:22:23.590564088 +0800 CST

2015-08-24 16:22:33.591194618 +0800 CST

2015-08-24 16:22:43.587720967 +0800 CST

2015-08-24 16:22:53.590231413 +0800 CST

2015-08-24 16:23:03.591164202 +0800 CST

....

懂的已经不用往下看了。

 

我真是恨透了 go编译运行时的依赖检查!有引入,但没应用的包,有创建,但没有使用的的变量,不让过。

另发现了特别情况

输出时间,完全不按常理,

fmt.Println 理论上是按行输出,理这个例子里
其实结果是这样的

2015-08-24 16:22:23.590564088 +0800 CST2015-08-24 16:22:33.591194618 +0800 CST2015-08-24 16:22:43.587720967 +0800 CST2015-08-24 16:22:53.590231413 +0800 CST2015-08-24 16:23:03.591164202 +0800 CST2015-08-24 16:23:13.588811769 +0800 CST2015-08-24 16:23:23.587282627 +0800 CST2015-08-24 16:23:33.588753016 +0800 CST2015-08-24 16:23:43.591157197 +0800 CST2015-08-24 16:23:53.589934072 +0800 CST

应该是shell的毛病

 

继续主题

找不到现成的资料。

看官方包的示例test代码

看go的time部分源码 Ticker结构 

 

type Ticker struct {

C <-chan Time // The channel on which the ticks are delivered.

r runtimeTimer

}

Time也类似

有一个只读的chanel“对象”


go的time和ticket的调用

或者叫timmer internal和其他语言的开发思路完全不一样。

其他语言,多是注册回调函数,定时,时间到了调用回调。

go是 通过 chan

的阻塞实现的。

调用的地方,读取chan 

定时,时间到,向chan写入值,阻塞解除,调用函数。

 


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:zihunqingxin

查看原文:go 的 time ticker 设置定时器,比较诡异……

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

8521 次点击  
加入收藏 微博
1 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传