💬

goのスケジュール処理についての云々。

2020/10/15に公開

目下、ラジオを簡単に録音する方向で動いている。定期処理をしたい。
要件としては以下である。

  • goがいい
  • 定期録音するからキャンセルできるといい
  • 動作はラズパイ

まぁ、ググるといい記事がありますね。

https://qiita.com/kawasin73/items/7af6766c7898a656b1ee

なるほど、確かにチャンネル使ってに平行処理が走ればgoのいいことが出るよね。
すいません、面倒くさがりなので影響が出なければそこそこ重くてもいいです。
そっから考えます。だけどラズパイだから全部goroutineするのは頂けないかなという訳でgocronあたりを、、、、

解析

https://github.com/jasonlvhit/gocron

中を見ると、途中キャンセルが出来なさそうだった。エラーで返すなよ!
と頭を抱えていた。

英語だからところどころ読み飛ばすので上から見てみる。

ありがとうございます、勝ちゲーです。現在はここでメンテナンスされているようです。

https://github.com/go-co-op/gocron

サンプルの作成


package main

import (
	"fmt"
	"os"
	"os/signal"
	"time"

	"github.com/go-co-op/gocron"
)

func task() {
	fmt.Println("I am running task.")
}

func main() {
	s1 := gocron.NewScheduler(time.Local)

	j, _ := s1.Every(2).Seconds().Do(task)
	s1.StartAsync()

	go func() {
		time.Sleep(time.Second * 5)
		s1.RemoveByReference(j)
		fmt.Println("task cancell")
	}()
	//待機
	quit := make(chan os.Signal)
	signal.Notify(quit, os.Interrupt)
	<-quit
}

2秒毎にメッセージを表示して、5秒後にタスク停止をしようとしてます 

ここまでいけばよいでしょう。
あとはやりたい放題です。

Discussion