- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试设置一个每小时整点运行的服务例程。在我看来,这两者中的任何一个都很容易。要在整点运行我的例程,我可以使用 time.AfterFunc()
,首先计算整点前的剩余时间。为了每小时运行一次例程,我可以使用 time.NewTicker()
。
但是,我正在努力弄清楚如何仅在传递给 AfterFunc()
的函数触发后才启动 NewTicker
。
我的 main()
函数看起来像这样:
func main() {
fmt.Println("starting up")
// Here I'm setting up all kinds of HTTP listeners and gRPC listeners, none
// of which is important, save to mention that the app has more happening
// than just this service routine.
// Calculate duration until next hour and call time.AfterFunc()
// For the purposes of this exercise I'm just using 5 seconds so as not to
// have to wait increments of hours to see the results
time.AfterFunc(time.Second * 5, func() {
fmt.Println("AfterFunc")
})
// Set up a ticker to run every hour. Again, for the purposes of this
// exercise I'm ticking every 2 seconds just to see some results
t := time.NewTicker(time.Second * 2)
defer t.Stop()
go func() {
for now := range t.C {
fmt.Println("Ticker")
}
}()
// Block until termination signal is received
osSignals := make(chan os.Signal, 1)
signal.Notify(osSignals, syscall.SIGINT, syscall.SIGTERM, os.Interrupt, os.Kill)
<-osSignals
fmt.Println("exiting gracefully")
}
当然 time.AfterFunc()
是阻塞的,我的 Ticker
的有效负载是故意放在一个 go 例程中的,所以它也不会阻塞。这是为了让我的 HTTP 和 gRPC 监听器可以继续监听,但也允许 main()
末尾的代码块在来自操作系统的终止信号时优雅地退出。但现在明显的缺点是 Ticker
几乎立即启动并在传递给 AfterFunc()
的函数触发之前触发两次(2 秒间隔)。输出如下所示:
Ticker
Ticker
AfterFunc
Ticker
Ticker
Ticker
etc.
我想要的当然是:
AfterFunc
Ticker
Ticker
Ticker
Ticker
Ticker
etc.
以下也不起作用,我不确定为什么。它打印 AfterFunc 但 Ticker 从未触发。
time.AfterFunc(time.Second * 5, func() {
fmt.Println("AfterFunc")
t := time.NewTicker(time.Second * 2)
defer t.Stop()
go func() {
for now := range t.C {
fmt.Println("Ticker")
}
}()
})
最佳答案
The Go Programming Language Specification
Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.
time.AfterFunc(time.Second * 5, func() {
fmt.Println("AfterFunc")
t := time.NewTicker(time.Second * 2)
defer t.Stop()
go func() {
for now := range t.C {
fmt.Println("Ticker")
}
}()
})
defer t.Stop()
停止自动收报机。
您不是在等待 goroutine 运行。
关于go - 先等待 time.AfterFunc 然后开始 time.NewTicker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57543721/
几个月前,我做了一个功能,我的应用程序正在等待用户文档并做出相应的响应。直到我对项目进行优化并将其更新到最新版本之前,它一直是一种魅力。 如果存在用户文档,则流将产生该文档并关闭该流。 如果云Fire
Stack Overflow 有几个 examples其中函数首先获得可升级锁,然后通过升级获得独占访问。我的理解是,如果不小心使用,这可能会导致死锁,因为两个线程可能都获得了可升级/共享锁,然后都尝
这个问题在这里已经有了答案: MVC 4 Code First ForeignKeyAttribute on property ... on type ... is not valid (1 个回答
以下是部分代码。我需要在 finally 子句中关闭资源。我需要先调用 closeEntry() 还是 close()?我收到一些错误消息。 Error closing the zipoutjava.
我想使用 RxJS-DOM 观察 mousewheel 事件,这样当第一个事件触发时,我转发它然后删除所有值,直到后续值之间的延迟超过先前指定的持续时间。 我想象的运算符可能看起来像: Rx.DOM.
版本似乎与安装的不同。 我在 npm install 上收到警告 我将二进制文件安装到我的家庭/开发目录中,但它不适用于 sudo。所以我安装了apt。 (注意:我并没有真正安装,我提取并将路径放在/
我正在尝试展示 GAN 网络在某些指定时期的结果。打印当前结果的功能以前与 TF 一起使用。我需要换成 pytorch。 def show_result(G_net, z_, num_epoch, s
我是一名优秀的程序员,十分优秀!