Как планировать задание периодически? - PullRequest
0 голосов
/ 30 октября 2018

Существует ли какая-либо нативная библиотека или сторонняя поддержка, такая как ScheduledExecutorService от нативной библиотеки java, на go lang для производственного использования?

Пожалуйста, найдите фрагмент кода в 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 !! каждую секунду.

1 Ответ

0 голосов
/ 30 октября 2018

Нет необходимости использовать стороннюю библиотеку для достижения этой цели. Просто воспользуйтесь преимуществами goroutine и используйте доступный time.Sleep() API из пакета time, тогда вы сможете достичь того же результата.

Пример:

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

Детская площадка: https://play.golang.org/p/IMV_IAt-VQX


Пример использования тикера # 1

Согласно предложению Сиддханты. Вот один пример достижения того же результата с помощью тикера (взят из перейдите на страницу документации тикера , с некоторыми изменениями в соответствии с вашим требованием).

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 t := range ticker.C {
        _ = t // we don't print the ticker time, so assign this `t` variable to underscore `_` to avoid error
        fmt.Println("Hello !!")
    }
}()

// wait for 10 seconds
time.Sleep(10 *time.Second)
ticker.Stop()
...