You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中如何处理channel和HTTP服务启动等阻塞操作?

Go语言同时启动HTTP服务与消息队列监听的实现方案

现有写法分析

你当前的实现可以正常运行,但存在冗余逻辑:
http.ListenAndServe 本身是永久阻塞方法,除非HTTP服务启动失败或主动终止,否则后续的 <-forever 代码永远不会执行,属于无效的死代码。
之所以功能看起来正常,是因为你在调用http.ListenAndServe前已经启动了消息队列监听的协程,该协程会在后台独立运行,和阻塞在HTTP服务启动逻辑的主协程互不干扰。

更规范的实现方式

如果要保障两个阻塞任务都正常运行,且主协程不会意外退出,建议将两个阻塞操作都放到独立协程中执行,主协程负责阻塞等待即可,参考代码:

// 启动消息队列监听协程
go func() {
    for d := range msgs {
        log.Printf("Received a message: %s", d.Body)
    }
    // 可补充队列关闭后的异常处理逻辑
}()

// 启动HTTP服务协程
go func() {
    addr := fmt.Sprintf(":%d", port)
    if err := http.ListenAndServe(addr, t.handler); err != nil {
        log.Fatalf("HTTP服务启动/运行失败: %v", err)
    }
}()

// 主协程永久阻塞,如需优雅退出可替换为信号监听逻辑
select {}

补充注意事项

  • 如果需要支持优雅退出,可将最后的select{}替换为系统信号监听逻辑,收到SIGINT、SIGTERM等退出信号后,先关闭HTTP服务、断开消息队列连接,再完成进程退出。
  • 建议在消息队列监听协程中增加panic捕获和异常处理逻辑,避免协程意外退出后业务无感知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:04