Golang并发服务器

2024-04-24 20:36:10 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我必须承认,我是一个关于并发的初学者,但是最近读了很多关于它的文章。因为我听说果朗在那个地区很强大。我想问(并发)服务器是如何用这种语言编写的。在

我的意思是,如何编写一个可以同时处理多个请求/连接的服务器有不同的方法。您可以使用线程、异步编程(例如Python中的async/asyncio),在Golang中有goroutines,这或多或少是一个轻量级线程。在

但是,当使用Python和async/asyncio时,可以有一个进程和一个线程,并且它能够处理并发性。但是,代码很复杂(至少对我来说没有任何背景)。在

我的问题: 如何在Golang中编写并发服务器?只是每个连接都有一个新的goroutine,还是有异步方式?什么是“最佳实践”?在

我的意思是,在一个高度使用的服务器上拥有大量goroutine不是很昂贵吗?如何在Golang做一个好的服务器?在


Tags: 方法代码服务器asyncio语言async进程编程
3条回答

对于初学者来说,最好的方法是使用https://golang.org/pkg/net/http/并编写http处理程序。{a2不需要初始化程序。在

代码将直接通过阻塞调用。在这个阶段,您不需要考虑并发性,因为Go会为您做这件事。例如当你打电话

record, err := someDb.GetRecordByID(123)

实际上,它是一个异步调用,它阻塞当前流,但将线程释放到其他Go例程。一旦返回数据并且线程(可能与以前不同)可用,它将继续流动。在

如果您需要在1个HTTP请求内进行并发调用,您可以启动Go例程。但把它留到后期,先做Go lang tour on concurrency。在

如果您确实需要HTTP请求的高负载解决方案,请考虑使用https://github.com/valyala/fasthttp而不是标准的http包。在

My question: What is the way to go to write a concurrent server in Golang? Just a new goroutine for every connection or are there any asynchronous ways? What's "best practice"?

golanghttp包将为你做请求并发处理,我真的喜欢代码看起来像同步的,你不需要添加任何异步/等待关键字。这是你的开始

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
}

http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":8080", nil))

对于HTTP@icza的评论和Alexander的回答,请给出一个合理的想法。仅仅添加goroutine并不昂贵,因为它们比普通线程轻。它们可以具有可变大小的堆栈(开始可能低至2k),因此可以以较少的操作开销很好地扩展。在

同样在http上,还有像Gorilla mux这样的第三方库,可以让生活变得更好,也可以像Buffalo这样的其他框架进行探索。虽然我没有使用后者,但我听说它使生活更轻松。在

现在,如果您要编写自己的自定义服务器(与http不同),那么Go是一个很好的选择。该程序可以像https://golang.org/pkg/net/#example_Listener一样简单地启动(要尝试运行此程序,可以从另一个终端使用类似于netcat的netcat)

$ nc localhost 2000
Hellow
Hellow

最后,Go中的通道使得跨例程共享数据和通信更加容易和安全,同时也考虑了同步方面的问题。希望这有帮助。在

相关问题 更多 >