如何优雅的使用Goroutine

如何优雅的使用Goroutine,第1张

概述1.ProcessesandThreads *** 作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄、设备和线程。线程是 *** 作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线 1. Processes and Threads

*** 作系统会为该应用程序创建一个进程。作为一个应用程序,它像一个为所有资源而运行的容器。这些资源包括内存地址空间、文件句柄、设备和线程。
线程是 *** 作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线程,当该线程终止时,进程终止。这是因为主线程是应用程序的原点。然后,主线程可以依次启动更多的线程,而这些线程可以启动更多的线程。
无论线程属于哪个进程, *** 作系统都会安排线程在可用处理器上运行。每个 *** 作系统都有自己的算法来做出这些决定。

2. Goroutines and Parallelism

Go 语言层面支持的 go 关键字,可以快速的让一个函数创建为 goroutine,我们可以认为 main 函数就是作为 goroutine 执行的。 *** 作系统调度线程在可用处理器上运行,Go运行时调度 goroutines 在绑定到单个 *** 作系统线程的逻辑处理器中运行(P)。即使使用这个单一的逻辑处理器和 *** 作系统线程,也可以调度数十万 goroutine 以惊人的效率和性能并发运行。

Concurrency is not Parallelism.                                                                                                 --Rob Pike

并发不是并行。并行是指两个或多个线程同时在不同的处理器执行代码。如果将运行时配置为使用多个逻辑处理器,则调度程序将在这些逻辑处理器之间分配 goroutine,这将导致 goroutine 在不同的 *** 作系统线程上运行。但是,要获得真正的并行性,您需要在具有多个物理处理器的计算机上运行程序。否则,goroutines 将针对单个物理处理器并发运行,即使 Go 运行时使用多个逻辑处理器。

3. Keep yourself busy or do the work yourself
package mainimport (	"fmt"	"log"	"net/http")func main() {	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {		fmt.Fprint(w, "Hello Gopher")	})	go func() {		if err := http.ListenAndServe(":8080", nil); err != nil {			log.Fatal(err)		}	}()	select {}}

举一个例子,用go实现一个http的服务,监听端口请求的任务交给一个goroutine处理,主进程用select{}阻塞,这样goroutine就可以处理来自8080端口的请求。从功能实现的角度来说,这样的写法确实达到了我们的目的。但是因为http.ListenAndServe是交给goroutine执行的,而且一旦出现了问题,main函数无法感知到,所以这样的实现是有缺点的。

package mainimport (	"fmt"	"log"	"net/http")func main() {	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {		fmt.Fprint(w, "Hello Gopher")	})	if err := http.ListenAndServe(":8080", nil); err != nil {		log.Fatal(err)	}}

换了一种方式,不用goroutine去监听,直接在main中,相较于上一种实现,我们解决了上面的 总结

以上是内存溢出为你收集整理的如何优雅的使用Goroutine全部内容,希望文章能够帮你解决如何优雅的使用Goroutine所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235420.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存