You need to enable JavaScript to run this app. 查找Go语言中与Python Queue功能等价的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

查找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() → Go userQueue = make(chan string, 缓冲大小)
  • Python q.put(i) → Go userQueue <- username
  • Python q.get() + 循环判断队列是否为空 → Go for user := range userQueue,自动处理阻塞、剩余数据读取、退出逻辑
  • Python 多线程跑check函数 → Go 用go check()开协程,资源开销更低并发性能更好

注意事项

  • 若不需要并发请求,直接删掉协程相关代码,在main函数里直接遍历userQueue处理即可
  • workerNum可根据目标API的限流规则调整,避免并发过高触发访问限制
  • 必须在所有数据入队后调用close(userQueue),否则消费协程会永远阻塞等待新数据,导致程序无法退出

内容的提问来源于stack exchange,提问作者user16402855

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 08:27:04