gddo-server: simplify background tasks with time.Tick

These tasks operate concurrently with the request flow anyway, so each
task should be on its own tick loop.

Change-Id: I129212b297db15395f7852e5b73e66081c63fbd0
Reviewed-on: https://go-review.googlesource.com/66652
Reviewed-by: Tuo Shan <shantuo@google.com>
diff --git a/gddo-server/background.go b/gddo-server/background.go
index 2a42276..025e6e1 100644
--- a/gddo-server/background.go
+++ b/gddo-server/background.go
@@ -15,50 +15,6 @@
 	"github.com/golang/gddo/gosrc"
 )
 
-type BackgroundTask struct {
-	name     string
-	fn       func() error
-	interval time.Duration
-	next     time.Time
-}
-
-func runBackgroundTasks() {
-	defer log.Println("ERROR: Background exiting!")
-
-	var backgroundTasks = []BackgroundTask{
-		{
-			name:     "GitHub updates",
-			fn:       readGitHubUpdates,
-			interval: viper.GetDuration(ConfigGithubInterval),
-		},
-		{
-			name:     "Crawl",
-			fn:       doCrawl,
-			interval: viper.GetDuration(ConfigCrawlInterval),
-		},
-	}
-
-	sleep := time.Minute
-	for _, task := range backgroundTasks {
-		if task.interval > 0 && sleep > task.interval {
-			sleep = task.interval
-		}
-	}
-
-	for {
-		for _, task := range backgroundTasks {
-			start := time.Now()
-			if task.interval > 0 && start.After(task.next) {
-				if err := task.fn(); err != nil {
-					log.Printf("Task %s: %v", task.name, err)
-				}
-				task.next = time.Now().Add(task.interval)
-			}
-		}
-		time.Sleep(sleep)
-	}
-}
-
 func doCrawl() error {
 	// Look for new package to crawl.
 	importPath, hasSubdirs, err := db.PopNewCrawl()
diff --git a/gddo-server/main.go b/gddo-server/main.go
index 018fa21..da97770 100644
--- a/gddo-server/main.go
+++ b/gddo-server/main.go
@@ -920,7 +920,20 @@
 		log.Fatalf("Error opening database: %v", err)
 	}
 
-	go runBackgroundTasks()
+	go func() {
+		for range time.Tick(viper.GetDuration(ConfigCrawlInterval)) {
+			if err := doCrawl(); err != nil {
+				log.Printf("Task Crawl: %v", err)
+			}
+		}
+	}()
+	go func() {
+		for range time.Tick(viper.GetDuration(ConfigGithubInterval)) {
+			if err := readGitHubUpdates(); err != nil {
+				log.Printf("Task GitHub updates: %v", err)
+			}
+		}
+	}()
 
 	staticServer := httputil.StaticServer{
 		Dir:    viper.GetString(ConfigAssetsDir),