老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網站建設、域名注冊、服務器等服務

Go語言中如何分析多進程、多線程與協(xié)程的引入

Go語言中如何分析多進程、多線程與協(xié)程的引入,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)服務項目包括建鄴網站建設、建鄴網站制作、建鄴網頁制作以及建鄴網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,建鄴網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到建鄴省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!

為什么要并發(fā)編程

在原生 PHP 中并沒有并發(fā)的概念,所有的操作都是串行執(zhí)行的、同步阻塞的,這也是很多人詬病 PHP 性能的原因,但是不支持并發(fā)編程的好處也是顯而易見的:保證了 PHP 的簡單性,開發(fā)者不必考慮并發(fā)引入的線程安全,也不需要在編程時權衡是否需要通過加鎖來保證某個操作的原子性,也沒有線程間通信問題,魚和熊掌不可得兼,你不可能既要上手簡單又要高性能,實際上,90%以上公司的業(yè)務和場景根本對性能沒有那么高的要求,傳統(tǒng)的 Nginx + PHP-FPM 完全以勝任了,如果非要在 PHP 中實現(xiàn)異步和并發(fā)編程,推薦使用 Swoole 擴展來解決(實際上,Swoole 實現(xiàn)并發(fā)編程的協(xié)程功能正是借鑒了 Go 語言的協(xié)程實現(xiàn)機制)。

下面,我們書歸正傳,來介紹 Go 語言中并發(fā)編程的概念和實現(xiàn)。

與并發(fā)相對的是串行,即代碼按照順序一行一行執(zhí)行,當遇到某個耗時的 IO 操作時,比如發(fā)送郵件、查詢數據庫等,要等到該 IO 操作完成后才能繼續(xù)執(zhí)行下一行代碼,這在一些要求高并發(fā)高性能的業(yè)務場景中,顯然是不合適的,從整個操作系統(tǒng)層面來說,多個任務是可以并發(fā)執(zhí)行的,因為 CPU 本身通常是多核的,而且即使是單核 CPU,也可以通過時間分片的方式在多個進程/線程之間切換執(zhí)行,從用戶角度來說,就好像它們在「同時發(fā)生」一樣,比如說,當程序執(zhí)行到 IO 操作時,我們可以掛起這個任務,把 CPU 時間片出讓給其他任務,然后當這個 IO 操作完成時,通知 CPU 恢復后續(xù)代碼的執(zhí)行,實際上 CPU 大部分時間都是在做這種調度。所以并發(fā)編程可以最大限度榨取 CPU 的價值,提高程序的執(zhí)行效率和性能。

并發(fā)編程的常見實現(xiàn)

目前,主流的并發(fā)編程實現(xiàn)有以下幾種方式:

  • 多進程。多進程是在操作系統(tǒng)層面進行并發(fā)的基本模式,同時也是開銷最大的模式。在 Linux 平臺上,很多工具正是采用這種模式在工作,比如 PHP-FPM,它會有專門的主進程負責網絡端口的監(jiān)聽和連接管理,還會有多個工作進程負責具體的請求處理。這種方法的好處在于簡單、進程間互不影響,壞處在于系統(tǒng)開銷大,因為所有的進程都是由內核管理的,而且不同進程的數據也是相互隔離的。

  • 多線程。多線程在大部分操作系統(tǒng)上都屬于系統(tǒng)層面的并發(fā)模式,也是我們使用最多的最有效的一種模式。目前,常見的幾乎所有工具都會使用這種模式,線程比進程輕量級,線程間可以共享數據,開銷要比多進程小很多,但是依舊比較大,且在高并發(fā)模式下,效率會有影響,比如 C10K 問題,即支持 1 萬個并發(fā)連接需要一萬個線程,這不但對系統(tǒng)資源有較高的要求,還對 CPU 管理這些線程帶來巨大負擔。

  • 基于回調的非阻塞/異步 IO。為了解決 C10K 問題,在很多高并發(fā)服務器開發(fā)實踐中,都會通過事件驅動的方式使用異步 IO,在這種模式下,一個線程可以維護多個 Socket 連接,從而降低系統(tǒng)開銷,保持服務器的持續(xù)運轉,它目前在 Node.js 中得到了很好的實踐,實際上 Nginx 也使用了這種方式。但是使用這種模式,編程比多線程要復雜,通常需要借助 Linux 底層的庫函數來實現(xiàn)。

  • 協(xié)程。協(xié)程(Coroutine)本質上是一種用戶態(tài)線程,你可以把它看作輕量級的線程,不需要操作系統(tǒng)來進行搶占式調度,系統(tǒng)開銷極小,可以有效提高線程的任務并發(fā)性,避免多線程的缺點。使用協(xié)程的優(yōu)點是編程簡單,結構清晰;缺點是需要語言級別的支持,如果不支持,則需要用戶在程序中自行實現(xiàn)相應的調度器。目前,原生支持協(xié)程的語言還很少,Go 語言就是其中這一,Go 語言中的協(xié)程稱作「goroutine」,并且使用語言名稱本身 go 做為協(xié)程的關鍵字,足見其在 Go 語言中的舉足輕重。PHP 的 Swoole 擴展也是參考了 Go 協(xié)程的實現(xiàn)將其搬到 PHP 中。

傳統(tǒng)并發(fā)模式的缺陷

接下來我們先詮釋一下傳統(tǒng)并發(fā)模型的缺陷,之后再講解 goroutine 并發(fā)模型是如何解決這些缺陷的。如果你之前只是熟悉 PHP 編程,沒有接觸過并發(fā)編程,那么需要好好消化下這些概念,學習完 Go 并發(fā)編程再回去看 Swoole 的協(xié)程,就非常駕輕就熟了。由于多進程比較消耗系統(tǒng)資源,且進程間數據隔離,CPU 切換成本高,因此,傳統(tǒng)并發(fā)編程多以多線程為主,比如 Java 就是這么做的。下面我們重點探討多線程與協(xié)程的對比。

我們之前在 PHP 中編程多是串行思維,串行的事務具有確定性,比如我們想好了123,然后按照這個順序來編寫代碼,代碼會嚴格按照這個設定的順序執(zhí)行,即使在某一個步驟阻塞了,也會一直等待阻塞代碼執(zhí)行完畢,再去執(zhí)行下一步的代碼。

多線程并發(fā)模式在這種確定性中引入了不確定性,比如我們原先設定的123,第2步是一個耗時操作,我們啟動了一個新的線程來處理,這個時候就存在了兩個并發(fā)的線程,即原來的主線程和第2步啟動的新線程,主線程繼續(xù)往后執(zhí)行,第2、3步的代碼并發(fā)執(zhí)行,這個時候不確定性就來了,我們不知道主線程執(zhí)行完畢的時候,新線程是否執(zhí)行完畢了,如果主線程執(zhí)行完畢退出應用,可能導致新線程的中斷,或者我們在第3步的時候依賴第2步的某個返回結果,我們不知道啥時候能夠返回這個結果,如果第2、3步有相互依賴的變量,甚至可能出現(xiàn)死鎖,以及我們如何在主線程中獲取新線程的異常和錯誤信息并進行相應的處理,等等,這種不確定性給程序的行為帶來了意外和危害,也讓程序變得不可控。

不同的線程好比平行時空,我們需要通過線程間通信來告知不同線程目前各自運行的狀態(tài)和結果,以便使程序可控,線程之間通信可以通過共享內存的方式(參考 Swoole 中的 Swoole Table),即在不同線程中操作的是同一個內存地址上存儲的值。為了保證共享內存的有效性,需要采取很多措施,比如加鎖來避免死鎖或資源競爭,還是以上面的主線程和新線程為例,如果我們在第1步獲取了一個中間結果,第2步和第3步都要對這個中間結果進行操作,如果不加鎖保證操作的原子性,很有可能產生臟數據。諸如此類的問題在生產環(huán)境極有可能造成重大故障甚至事故,而且不易察覺和調試。

我們可以將線程加共享內存的方式稱為「共享內存系統(tǒng)」。為了解決共享內存系統(tǒng)存在的問題,計算機科學家們又提出了「消息傳遞系統(tǒng)」,所謂「消息傳遞系統(tǒng)」指的是將線程間共享狀態(tài)的各種操作都封裝在線程之間傳遞的消息中,這通常要求發(fā)送消息時對狀態(tài)進行復制,并且在消息傳遞的邊界上交出這個狀態(tài)的所有權。從表明上來看,這個操作與「共享內存系統(tǒng)」中執(zhí)行的通過加鎖實現(xiàn)原子更新操作相同,但從底層實現(xiàn)上來看則不同:一個對同一個內存地址持有的值進行操作,一個是從消息通道讀取數據并處理。由于需要執(zhí)行狀態(tài)復制操作,所以大多數消息傳遞的實現(xiàn)在性能上并不優(yōu)越,但線程中的狀態(tài)管理工作則會變得更加簡單,這就有點像我們在開篇講 PHP 不支持并發(fā)編程提到的那樣,如果想讓編碼簡單,性能就要做犧牲,如果想追求性能,代碼編寫起來就比較費勁,這也是我們?yōu)槭裁赐ǔ2粫苯油ㄟ^事件驅動的異步 IO 來實現(xiàn)并發(fā)編程一樣,因為這涉及到直接調用操作系統(tǒng)底層的庫函數(select、epoll、libevent 等)來實現(xiàn),非常復雜。

注:最早被廣泛應用的「消息傳遞系統(tǒng)」是由 C. A. R. Hoare 在他的 Communicating Sequential Processes 中提出的,在 CSP 系統(tǒng)中,所有的并發(fā)操作都是通過獨立線程以異步運行的方式來實現(xiàn)的。這些線程必須通過在彼此之間發(fā)送消息,從而向另一個線程請求信息或者將信息提供給另一個線程。

Go 語言協(xié)程支持

與傳統(tǒng)的系統(tǒng)級線程和進程相比,協(xié)程的最大優(yōu)勢在于輕量級(可以看作用戶態(tài)的輕量級線程),我們可以輕松創(chuàng)建上百萬個協(xié)程而不會導致系統(tǒng)資源衰竭,而線程和進程通常最多也不能超過 1 萬個(C10K問題)。多數語言在語法層面并不直接支持協(xié)程,而是通過庫的方式支持,比如 PHP 的 Swoole 擴展庫,但用庫的方式支持的功能通常并不完整,比如僅僅提供輕量級線程的創(chuàng)建、銷毀與切換等能力。如果在這樣的輕量級線程中調用一個同步 IO 操作,比如網絡通信、本地文件讀寫,都會阻塞其他的并發(fā)執(zhí)行輕量級線程,從而無法真正達到輕量級線程本身期望達到的目標。

Go 語言在語言級別支持協(xié)程,稱之為 goroutine。Go 語言標準庫提供的所有系統(tǒng)調用操作(當然也包括所有同步 IO 操作),都有協(xié)程的身影。協(xié)程間的切換管理不依賴于系統(tǒng)的線程和進程,也不依賴于 CPU 的核心數量,這讓我們在 Go 語言中通過協(xié)程實現(xiàn)并發(fā)編程變得非常簡單。

Go 語言的協(xié)程系統(tǒng)是基于「消息傳遞系統(tǒng)」實現(xiàn)的,在 Go 語言的編程哲學中,創(chuàng)始人 Rob Pike 推介「Don’t communicate by sharing memory, share memory by communicating(不要通過共享內存來通信,而應該通過通信來共享內存)」,這正是「消息傳遞系統(tǒng)」的精髓所在。Go 語言中的 goroutine 和用于傳遞協(xié)程間消息的 channel 一起,共同構筑了 Go 語言協(xié)程系統(tǒng)的基石。

go適合做什么

go是golang的簡稱,而golang可以做服務器端開發(fā),且golang很適合做日志處理、數據打包、虛擬機處理、數據庫代理等工作。在網絡編程方面,它還廣泛應用于web應用、API應用等領域。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


新聞標題:Go語言中如何分析多進程、多線程與協(xié)程的引入
URL地址:http://www.xueling.net.cn/article/jghgds.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 久久久久女教师免费一区 | 欧美性猛交99久久久久99 | 亚洲日韩欧美综合不卡在线 | 色妞www精品视频观看软件 | 国产美女遭强高潮免费 | 亚洲欧洲日本无在线码天堂 | 秦岭神树动漫版免费看 | 九九九久久久久久久 | 78摸在线观看 | 999久久久无码国产精品 | 久久一级黄色 | 9999热视频 | 亚a洲v中文字幕2023 | 热久久只有精品 | 久久99精品久久久久久秒播 | 亚洲视频在线观看视频 | 视频一级片 | 欧美激情五月 | p影院永久免费p视频 | 色香蕉成人二区免费 | 免费女人18毛片a毛片视频 | 国产精品久久久久久久免费看 | 18高清免费a级毛片av | 人人擦人人干 | 欧美成人精品A∨在线观看 啪啪av网站 | 欧美精品一区二区三区四区五区 | 免费看成人AA片无码视频吃奶 | 久久久6| 精品欧美一二三区 | 野花香视频在线观看最新 | 视屏一区| 真人无码作爱免费视频 | 嗯啊av| 4438ⅹ亚洲全国最大色丁香 | 欧美精品久久久免费观看 | 中文字幕有码无码人妻在线 | 精品人妻无码视频中文字幕一区二区三区 | 欧美精品欧美精品系列c | 666av视频在线观看 | 日韩在线中文高清在线资源 | 久久国产精品视频在线 |