登录
首页 >  Golang >  Go问答

为什么在同一个 Go 项目中无法同时启动多个服务器?

来源:stackoverflow

时间:2024-02-22 19:36:18 441浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《为什么在同一个 Go 项目中无法同时启动多个服务器?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我是一名新的 go 开发人员,我正在尝试构建一个同时具有 grpc 服务器和 gin http 服务器的单个项目。我的代码大致如下:

package main

import (
    "log"
    "net"

    "github.com/gin-gonic/gin"
    "google.golang.org/grpc"
)

func main() {
    startGRPCServer()
    startHTTPServer()
}

func startGRPCServer() {
    listener, err := net.Listen("tcp", ":9000")
    if err != nil {
        log.Fatalf("could not attach listener to port: %v", err)
    }

    s := grpc.NewServer()
    if err := s.Serve(listener); err != nil {
        log.Fatalf("could not start grpc server: %v", err)
    }
}

func startHTTPServer() {
    g := gin.Default()

    if err := g.Run(":8000"); err != nil {
        log.Fatalf("could not start http server: %v", err)
    }
}

当我运行上面的代码时,只有 grpc 服务器启动。 starthttpserver() 函数甚至没有被调用。当我切换调用顺序时(将 starthttpserver() 移至 startgrpcserver() 上方), startgrpcserver() 函数永远不会被调用。为什么会出现这种情况?我怎样才能解决这个问题,以便两个函数都被调用并且两个服务器都运行?


正确答案


startgrpcserver 函数会阻止运行 grpc 服务器。在 goroutine 中运行 grpc 服务器,以便 startgrpcserver 返回。

func startGRPCServer() {
    listener, err := net.Listen("tcp", ":9000")
    if err != nil {
        log.Fatalf("could not attach listener to port: %v", err)
    }

    s := grpc.NewServer()
    go func() {
        if err := s.Serve(listener); err != nil {
            log.Fatalf("could not start grpc server: %v", err)
        }
    }()
}

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《为什么在同一个 Go 项目中无法同时启动多个服务器?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>