gpt4 book ai didi

go - 限制每秒 ping 主机名的次数

转载 作者:IT王子 更新时间:2023-10-29 02:13:10 27 4
gpt4 key购买 nike

我正在写一个网络爬虫来学习go

我当前的实现使用 10 个 go 例程来获取网站,我想限制每秒可以访问主机名的次数。

执行此操作的最佳(线程安全)方法是什么。

最佳答案

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
}

单个 go 例程等待每个自动收报机事件并尝试将缓冲 channel 填充到最大容量。如果消费者没有耗尽缓冲区,则任何连续的滴答只会重新填充它。您可以使用 channel 在每个 持续时间 中最多同步执行一个操作 n 次。例如,我可能希望每秒调用 doSomething() 不超过五次。

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

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

自然地,同一个 channel 可用于调用 go doSomething(),它每 最多扇出 5 个进程。

关于go - 限制每秒 ping 主机名的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com