查找Go语言中与Python Queue功能等价的实现方法
Go实现队列消费用户名发起HTTP请求方案
Go原生没有提供单独的Queue标准库包,带缓冲的channel天然就是并发安全的队列实现,完全匹配Python Queue.Queue的阻塞入队、阻塞出队、多协程/线程安全的特性,和你原有逻辑的对齐度非常高。
完整可运行实现代码
package main import ( "bufio" "fmt" "net/http" "os" "sync" ) // 全局队列,用带缓冲channel实现,等价于Python的Queue实例 var userQueue chan string // 消费队列逻辑,等价于你Python的check函数 func check(baseUrl string, wg *sync.WaitGroup) { // 协程执行完毕后通知WaitGroup defer wg.Done() // 遍历channel等价于循环调用q.get(),channel关闭后遍历完剩余数据自动退出 for user := range userQueue { targetUrl := baseUrl + user // 发起HTTP请求,等价于你的makeRequest调用 resp, err := http.Get(targetUrl) if err != nil { fmt.Printf("请求[%s]失败: %v\n", targetUrl, err) continue } // 必须关闭响应体避免内存泄漏 _ = resp.Body.Close() fmt.Printf("请求[%s]完成,状态码: %d\n", targetUrl, resp.StatusCode) } } func main() { // 自定义配置项,可根据需求修改 const baseURL = "https://your-api-domain.com/user/" const usernameFilePath = "./usernames.txt" // 并发消费的协程数量,对应Python开的check线程数 const workerNum = 8 // 队列缓冲大小,可根据用户名总量调整 const queueBufferSize = 1024 // 初始化队列 userQueue = make(chan string, queueBufferSize) // 用于等待所有协程处理完成的同步工具 var wg sync.WaitGroup // 读取用户名文件写入队列,等价于Python main里的for循环q.put逻辑 file, err := os.Open(usernameFilePath) if err != nil { panic(fmt.Sprintf("打开用户名文件失败: %v", err)) } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { username := scanner.Text() // 写入channel等价于q.put操作 userQueue <- username } if err = scanner.Err(); err != nil { panic(fmt.Sprintf("读取用户名文件失败: %v", err)) } // 所有数据入队完成后关闭channel,通知消费协程没有新数据了 close(userQueue) // 启动指定数量的消费协程 wg.Add(workerNum) for i := 0; i < workerNum; i++ { go check(baseURL, &wg) } // 阻塞等待所有消费协程处理完成 wg.Wait() fmt.Println("全部请求处理结束") }
逻辑对应说明
- Python
q = Queue()→ GouserQueue = make(chan string, 缓冲大小) - Python
q.put(i)→ GouserQueue <- username - Python
q.get()+ 循环判断队列是否为空 → Gofor user := range userQueue,自动处理阻塞、剩余数据读取、退出逻辑 - Python 多线程跑check函数 → Go 用
go check()开协程,资源开销更低并发性能更好
注意事项
- 若不需要并发请求,直接删掉协程相关代码,在main函数里直接遍历
userQueue处理即可 workerNum可根据目标API的限流规则调整,避免并发过高触发访问限制- 必须在所有数据入队后调用
close(userQueue),否则消费协程会永远阻塞等待新数据,导致程序无法退出
内容的提问来源于stack exchange,提问作者user16402855
相关产品推荐
相关产品推荐

