Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
使用 Go 实现可动态更新 URL 列表的定时轮询任务_创想鸟

使用 Go 实现可动态更新 URL 列表的定时轮询任务

使用 go 实现可动态更新 url 列表的定时轮询任务

本文介绍如何使用 Go 语言实现一个定时轮询任务,该任务可以定期抓取 URL 列表的内容,并支持在运行时动态添加新的 URL 到列表中。通过使用 Go 语言的并发特性和 channel,可以安全高效地管理 URL 列表的更新,确保轮询任务始终包含最新的 URL 信息。

在 Go 语言中,并发编程是一个重要的特性。本文将介绍如何使用 Go 语言实现一个可动态更新 URL 列表的定时轮询任务。这个任务会定期抓取 URL 列表中的内容,并且允许在运行时安全地添加新的 URL 到列表中。

实现原理

核心思想是使用一个 harvester 结构体来管理 URL 列表和定时器。harvester 结构体包含以下字段:

ticker: 一个 time.Ticker 实例,用于触发定时轮询。add: 一个 channel,用于接收需要添加的 URL。urls: 一个字符串切片,存储当前需要轮询的 URL 列表。

harvester 结构体还包含以下方法:

newHarvester(): 构造函数,创建一个新的 harvester 实例,并启动一个 goroutine 来运行 run() 方法。run(): harvester 的核心方法,在一个无限循环中监听 ticker.C 和 add channel。当 ticker.C 接收到信号时,遍历 urls 列表,并调用 harvest() 函数抓取每个 URL 的内容。当 add channel 接收到 URL 时,将其添加到 urls 列表中。AddURL(u string): 将新的 URL 发送到 add channel,以添加到 URL 列表中。

代码示例

package mainimport (    "fmt"    "time")type harvester struct {    ticker *time.Ticker // periodic ticker    add    chan string  // new URL channel    urls   []string     // current URLs}func newHarvester() *harvester {    rv := &harvester{        ticker: time.NewTicker(time.Minute * 30),        add:    make(chan string),        urls:   []string{}, // 初始化为空切片    }    go rv.run()    return rv}func (h *harvester) run() {    for {        select {        case <-h.ticker.C:            // When the ticker fires, it's time to harvest            for _, u := range h.urls {                harvest(u)            }        case u := <-h.add:            // At any time (other than when we're harvesting),            // we can process a request to add a new URL            h.urls = append(h.urls, u)            fmt.Println("Added URL:", u, "Current URLs:", h.urls) // 打印当前URL列表        }    }}func (h *harvester) AddURL(u string) {    // Adding a new URL is as simple as tossing it onto a channel.    h.add <- u}func harvest(url string) {    // Download the current contents of the URL and do something with it    fmt.Println("Harvesting:", url)    // Simulate network request delay    time.Sleep(time.Second * 2)    fmt.Println("Harvested:", url)}func main() {    h := newHarvester()    // Add some initial URLs    h.AddURL("https://www.example.com/page1")    h.AddURL("https://www.example.com/page2")    // Add a new URL after a delay    time.Sleep(time.Minute * 1)    h.AddURL("https://www.example.com/page3")    // Keep the main function running to allow the harvester to work    time.Sleep(time.Hour * 1)}

代码解释:

harvester 结构体: 定义了轮询任务所需的数据结构,包括定时器、URL 列表和用于添加 URL 的 channel。newHarvester() 函数: 创建并初始化 harvester 实例,并启动一个 goroutine 运行 run() 方法。 注意需要初始化 urls: []string{},否则会panicrun() 方法: harvester 的核心逻辑,使用 select 语句监听定时器和添加 URL 的 channel。当定时器触发时,遍历 URL 列表并调用 harvest() 函数。当接收到新的 URL 时,将其添加到 URL 列表中。AddURL() 方法: 向 add channel 发送新的 URL,以添加到 URL 列表中。harvest() 函数: 模拟抓取 URL 内容的函数。在实际应用中,需要替换为真实的 HTTP 请求代码。main() 函数: 创建 harvester 实例,添加一些初始 URL,并在一段时间后添加一个新的 URL。

运行结果

运行上述代码,可以看到以下输出:

Added URL: https://www.example.com/page1 Current URLs: [https://www.example.com/page1]Added URL: https://www.example.com/page2 Current URLs: [https://www.example.com/page1 https://www.example.com/page2]Harvesting: https://www.example.com/page1Harvested: https://www.example.com/page1Harvesting: https://www.example.com/page2Harvested: https://www.example.com/page2Added URL: https://www.example.com/page3 Current URLs: [https://www.example.com/page1 https://www.example.com/page2 https://www.example.com/page3]Harvesting: https://www.example.com/page1Harvested: https://www.example.com/page1Harvesting: https://www.example.com/page2Harvested: https://www.example.com/page2Harvesting: https://www.example.com/page3Harvested: https://www.example.com/page3

可以看到,新的 URL 在添加到列表后,会在下一次轮询时被抓取。

注意事项

错误处理: 在 harvest() 函数中,应该添加适当的错误处理机制,以处理 HTTP 请求失败的情况。并发安全: 由于 urls 列表会被多个 goroutine 同时访问,因此需要确保并发安全。在上面的代码中,通过 channel 来同步对 urls 列表的访问,保证了并发安全。资源释放: 当不再需要 harvester 实例时,应该调用 ticker.Stop() 方法来停止定时器,释放资源。URL 去重: 如果需要避免重复添加相同的 URL,可以在 AddURL() 方法中添加 URL 去重逻辑。

总结

本文介绍了一种使用 Go 语言实现可动态更新 URL 列表的定时轮询任务的方法。通过使用 Go 语言的并发特性和 channel,可以安全高效地管理 URL 列表的更新,确保轮询任务始终包含最新的 URL 信息。这种方法可以应用于各种需要定期抓取 URL 内容的场景,例如网站监控、数据采集等。

以上就是使用 Go 实现可动态更新 URL 列表的定时轮询任务的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1413585.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Golang如何实现用户权限控制
上一篇 2025年12月16日 07:22:11
Go语言本地包导入与项目结构管理指南
下一篇 2025年12月16日 07:22:25

相关推荐

发表回复

登录后才能评论
关注微信