下面由golang教學專欄跟大家介紹聊一聊golang的協程,希望對需要的朋友有幫助!
協程是應用層的執行緒。
應用層是相對於核心層而言,是作業系統的概念,對應的是cpu的運作等級。作業系統的核心程式碼運行的ring0級,應用程式的程式碼運行在ring3級別。核心與應用層的層級設定保證了一些高權限的操作只有核心程式碼能做,應用程式要使用這些功能必須透過呼叫作業系統的API(linux上稱為系統呼叫)來呼叫核心的程式碼。這個呼叫會導致cpu從ring3到ring0的上下文切換,這個切換是耗費一些cpu時間的。
執行緒是作業系統的核心對象,當多執行緒程式設計時,如果執行緒數過多,就會導致頻繁的上下文切換,這些cpu時間是一個額外的耗費。所以在一些高並發的網頁伺服器程式設計中,使用一個執行緒服務一個socket連線是很不明智的。於是作業系統提供了一個基於事件模式的非同步程式設計模型。用少量的線程來服務大量的網路連接和I/O操作。但是採用非同步和基於事件的程式設計模型,複雜化了程式碼的編寫,非常容易出錯。因為線程穿插,也提高排查錯誤的難度。
協程,是在應用層模擬的線程,他避免了上下文切換的額外耗費,並兼顧了多線程的優點。簡化了高並發程序的複雜度。舉個例子,一個高並發的網頁伺服器,每一個socket連接進來,伺服器用一個協程來對他進行服務。代碼非常清晰。而且兼顧了性能。
那麼,協程是怎麼實現的呢?
他和執行緒的原理是一樣的,當a執行緒切換到b執行緒的時候,需要將a執行緒的相關執行進度壓入棧,然後將b執行緒的執行進度出棧,進入b的執行序列。協程只不過是在應用成實現這一點。
但是,協程並不是有作業系統調度的,而且應用程式也沒有能力和權限執行cpu調度。怎麼解決這個問題?
答案是,協程是基於執行緒的。內部實作上,維護了一組資料結構和n個線程,真正的執行還是線程,協程執行的程式碼被丟進一個待執行佇列中,有這n個執行緒從佇列中拉出來執行。這就解決了協程的執行問題。那麼協程是怎麼切換的呢?答案是:golang對各種io函數進行了封裝,這些封裝的函數提供給應用程式使用,而其內部調用了作業系統的非同步io函數,當這些非同步函數返回busy或bloking時,golang利用這個時機將現有的執行序列壓棧,讓執行緒去拉另外一個協程的程式碼來執行,基本原理就是這樣,利用並封裝了作業系統的非同步函數。包括linux的epoll,select和windows的iocp,event等。
由於golang是從編譯器和語言基礎庫多個層面對協程做了實現,所以,golang的協程是目前各類有協程概念的語言中實現的最完整和成熟的。
十萬協程同時運作也毫無壓力。關鍵我們不會這麼寫程式碼。但是總體而言,程式設計師可以在編寫golang的程式碼是,可以更多的關注業務邏輯的實現,更少的在這些關鍵的基礎構件上耗費太多精力。
以上是聊一聊golang的協程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

go语言有缩进。在go语言中,缩进直接使用gofmt工具格式化即可(gofmt使用tab进行缩进);gofmt工具会以标准样式的缩进和垂直对齐方式对源代码进行格式化,甚至必要情况下注释也会重新格式化。

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。

本篇文章带大家了解一下golang 的几种常用的基本数据类型,如整型,浮点型,字符,字符串,布尔型等,并介绍了一些常用的类型转换操作。

是,TiDB采用go语言编写。TiDB是一个分布式NewSQL数据库;它支持水平弹性扩展、ACID事务、标准SQL、MySQL语法和MySQL协议,具有数据强一致的高可用特性。TiDB架构中的PD储存了集群的元信息,如key在哪个TiKV节点;PD还负责集群的负载均衡以及数据分片等。PD通过内嵌etcd来支持数据分布和容错;PD采用go语言编写。

go语言需要编译。Go语言是编译型的静态语言,是一门需要编译才能运行的编程语言,也就说Go语言程序在运行之前需要通过编译器生成二进制机器码(二进制的可执行文件),随后二进制文件才能在目标机器上运行。

在写 Go 的过程中经常对比这两种语言的特性,踩了不少坑,也发现了不少有意思的地方,下面本篇就来聊聊 Go 自带的 HttpClient 的超时机制,希望对大家有所帮助。

删除map元素的两种方法:1、使用delete()函数从map中删除指定键值对,语法“delete(map, 键名)”;2、重新创建一个新的map对象,可以清空map中的所有元素,语法“var mapname map[keytype]valuetype”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。