2016-09-30 56 views
1

我寫一個網絡爬蟲學去限制的次主機數量的ping每秒

我的當前實現使用10個走程序,以獲取網站,我想限制的時候,我可以打一個數主機名每秒。

什麼是最好的(線程安全)方法來做到這一點。

+1

請發佈一些代碼示例 –

+1

請參閱:我如何在Golang中每秒執行多次命令:http://stackoverflow.com/questions/39385883/how-do-i-execute-commands-many-many -times每秒合golang – 2016-10-01 07:35:47

回答

1

A channel提供了一個可用於協調的併發同步機制。您可以使用一個與time.Ticker協調的定期分派給定數量的函數調用。

// A PeriodicResource is a channel that is rebuffered periodically. 
type PeriodicResource <-chan bool 

// The NewPeriodicResourcePool provides a buffered channel that is filled after the 
// given duration. The size of the channel is given as count. This provides 
// a way of limiting an function to count times per duration. 
func NewPeriodicResource(count int, reset time.Duration) PeriodicResource { 
    ticker := time.NewTicker(reset) 
    c := make(chan bool, count) 

    go func() { 
     for { 
      // Await the periodic timer 
      <-ticker.C 

      // Fill the buffer 
      for i := len(c); i < count; i++ { 
       c <- true 
      } 
     } 
    }() 

    return c 
} 

單程序例程會等待每個ticker事件並嘗試將緩衝通道填充到最大容量。如果消費者沒有消耗緩衝區,則任何連續的滴答只會補充它。您可以使用該頻道同步執行最多ñ次/ 持續時間。例如,我可能想每秒鐘撥打doSomething()不超過五次。

r := NewPeriodicResource(5, time.Second) 
for { 
     // Attempt to deque from the PeriodicResource 
     <-r 

     // Each call is synchronously drawing from the periodic resource 
     doSomething() 
} 

當然,相同的信道可被用於每第二調用go doSomething()這將風扇出至多過程。

相關問題