Golang中的并发服务器

时间:2017-09-21 09:36:06

标签: python multithreading asynchronous go concurrency

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

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

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

我的问题: 在Golang中编写并发服务器的方法是什么?只是每个连接的新goroutine或有任何异步方式?什么是最佳实践"?

我的意思是在高度使用的服务器上拥有大量的goroutine并不昂贵吗?如何在Golang中编写一个编写良好的服务器?

3 个答案:

答案 0 :(得分:1)

对于初学者来说,最好的方法就是使用https://golang.org/pkg/net/http/并编写http处理程序。您无需初始化Go例程 - http.Server将为您执行此操作。

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

的调用时
record, err := someDb.GetRecordByID(123)

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

如果您需要在1个HTTP请求中进行并发调用,则可以启动Go例程。但是请将其保留到以后的阶段,然后先进行Go lang tour on concurrency

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

答案 1 :(得分:1)

对于HTTP @ icza的评论&亚历山大的回答给出了一个公平的想法。只是添加Goroutines并不昂贵,因为它们比普通线程更轻。它们可以具有可变大小的堆栈(可能从低至2k开始)&因此可以用更少的操作开销进行扩展。

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

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

$ nc localhost 2000
Hellow
Hellow

最后Go中的频道可以共享数据&在处理同步方面的例程中,通信变得更加容易和安全。希望这会有所帮助。

答案 2 :(得分:1)

  

我的问题:编写并发服务器的方法是什么?   Golang?对于每个连接只是一个新的goroutine或者有没有   异步方式?什么是“最佳实践”?

Golang http包将为您执行请求并发处理,我真的希望代码看起来像是同步的,您不需要添加任何async / await关键字。这是你如何开始

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

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