如何定期在go上安排任务?

问题描述 投票:0回答:1

是否有任何本机库或第三方支持,例如 go lang 的 java 本机库的

ScheduledExecutorService
用于生产用例?

请在java 1.8中找到代码片段:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class TaskScheduler {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Runnable runnable = ()-> {
                // task to run goes here
                System.out.println("Hello !!");
        };
        ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
        service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);

    }

}

每隔一秒就会打印

Hello !!

go scheduled-tasks scheduler
1个回答
42
投票

实际上不需要第三方库来实现这一点。只需利用

time.Sleep()
包中的 goroutine 和
time
API,即可实现完全相同的结果。

示例:

go func() {
    for true {
        fmt.Println("Hello !!")
        time.Sleep(1 * time.Second)
    }
}()

游乐场:https://play.golang.org/p/IMV_IAt-VQX


使用代码 #1 的示例

根据Siddhanta的建议。下面是一个使用股票代码实现相同结果的示例(取自股票代码的go文档页面,根据您的要求进行了一些修改)。

done := make(chan bool)
ticker := time.NewTicker(1 * time.Second)

go func() {
    for {
        select {
        case <-done:
            ticker.Stop()
            return
        case <-ticker.C:
            fmt.Println("Hello !!")
        }
    }
}()

// wait for 10 seconds
time.Sleep(10 *time.Second)
done <- true

股票行情时间信息(

Hello !!
执行的时间)可以从
ticker.C
通道获取。

case t := <-ticker.C:
    fmt.Println(t)

游乐场:https://play.golang.org/p/TN2M-AMr39L


使用代码 #2 的示例

另一个简化的股票代码示例,取自 https://gobyexample.com/tickers

ticker := time.NewTicker(1 * time.Second)
go func() {
    for range ticker.C {
        fmt.Println("Hello !!")
    }
}()

// wait for 10 seconds
time.Sleep(10 *time.Second)
ticker.Stop()
© www.soinside.com 2019 - 2024. All rights reserved.