1
0
mirror of https://github.com/golang/go synced 2024-11-21 17:04:42 -07:00

doc/codewalk: update urlpoll to use time.Duration.

R=adg
CC=golang-dev
https://golang.org/cl/5545061
This commit is contained in:
Stefan Nilsson 2012-01-19 14:45:59 +11:00 committed by Andrew Gerrand
parent 885cbc3be4
commit 1de4931113

View File

@ -11,11 +11,10 @@ import (
) )
const ( const (
numPollers = 2 // number of Poller goroutines to launch numPollers = 2 // number of Poller goroutines to launch
second = 1e9 // one second is 1e9 nanoseconds pollInterval = 60 * time.Second // how often to poll each URL
pollInterval = 60 * second // how often to poll each URL statusInterval = 10 * time.Second // how often to log status to stdout
statusInterval = 10 * second // how often to log status to stdout errTimeout = 10 * time.Second // back-off timeout on error
errTimeout = 10 * second // back-off timeout on error
) )
var urls = []string{ var urls = []string{
@ -33,7 +32,7 @@ type State struct {
// StateMonitor maintains a map that stores the state of the URLs being // StateMonitor maintains a map that stores the state of the URLs being
// polled, and prints the current state every updateInterval nanoseconds. // polled, and prints the current state every updateInterval nanoseconds.
// It returns a chan State to which resource state should be sent. // It returns a chan State to which resource state should be sent.
func StateMonitor(updateInterval int64) chan<- State { func StateMonitor(updateInterval time.Duration) chan<- State {
updates := make(chan State) updates := make(chan State)
urlStatus := make(map[string]string) urlStatus := make(map[string]string)
ticker := time.NewTicker(updateInterval) ticker := time.NewTicker(updateInterval)
@ -61,7 +60,7 @@ func logState(s map[string]string) {
// Resource represents an HTTP URL to be polled by this program. // Resource represents an HTTP URL to be polled by this program.
type Resource struct { type Resource struct {
url string url string
errCount int64 errCount int
} }
// Poll executes an HTTP HEAD request for url // Poll executes an HTTP HEAD request for url
@ -79,8 +78,8 @@ func (r *Resource) Poll() string {
// Sleep sleeps for an appropriate interval (dependant on error state) // Sleep sleeps for an appropriate interval (dependant on error state)
// before sending the Resource to done. // before sending the Resource to done.
func (r *Resource) Sleep(done chan *Resource) { func (r *Resource) Sleep(done chan<- *Resource) {
time.Sleep(pollInterval + errTimeout*r.errCount) time.Sleep(pollInterval + errTimeout*time.Duration(r.errCount))
done <- r done <- r
} }
@ -93,18 +92,18 @@ func Poller(in <-chan *Resource, out chan<- *Resource, status chan<- State) {
} }
func main() { func main() {
// create our input and output channels // Create our input and output channels.
pending, complete := make(chan *Resource), make(chan *Resource) pending, complete := make(chan *Resource), make(chan *Resource)
// launch the StateMonitor // Launch the StateMonitor.
status := StateMonitor(statusInterval) status := StateMonitor(statusInterval)
// launch some Poller goroutines // Launch some Poller goroutines.
for i := 0; i < numPollers; i++ { for i := 0; i < numPollers; i++ {
go Poller(pending, complete, status) go Poller(pending, complete, status)
} }
// send some Resources to the pending queue // Send some Resources to the pending queue.
go func() { go func() {
for _, url := range urls { for _, url := range urls {
pending <- &Resource{url: url} pending <- &Resource{url: url}