99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

golang并發(fā)機(jī)制和其他語(yǔ)言在實(shí)現(xiàn)上有什么不同

馬哥Linux運(yùn)維 ? 來(lái)源:Go開(kāi)發(fā)大全 ? 作者:Go開(kāi)發(fā)大全 ? 2021-07-29 16:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

golang 并發(fā)機(jī)制和其他語(yǔ)言在實(shí)現(xiàn)上有什么不同?為什么能做到高效快速?本文做了詳細(xì)介紹。

由于對(duì)普通語(yǔ)法的介紹網(wǎng)上資源極多,Go 官方的上手指南 A Tour of Go: https://tour.golang.org/ (請(qǐng)自備梯子)就是極好的例子,我不再打算就語(yǔ)法細(xì)節(jié)進(jìn)行詳述。這次,讓我們直切肯綮,從 Go 最大的賣(mài)點(diǎn)入手——并發(fā) (Concurrency)。

func Hello() {

fmt.Println(“I‘m B”) // Output A

}

go Hello()

fmt.Println(“I’m A”) // Output B

如果在雙核(及以上)的機(jī)器編譯運(yùn)行上述 Go 代碼,我們能觀測(cè)到 A/B 輸出的順序隨著運(yùn)行次數(shù)的不同而不同,也就是說(shuō),僅依靠 5 行代碼,我們就創(chuàng)建了兩線(xiàn)并發(fā)的程序。

相較于 C/C++/Java/Python 等語(yǔ)言為了創(chuàng)建一個(gè)并發(fā)執(zhí)行環(huán)境所需要的調(diào)用 POSIX-API/定義繼承類(lèi)等繁瑣步驟,Golang 簡(jiǎn)單一句 go func()的確給人眼前一亮的感覺(jué)。當(dāng)然了,僅憑語(yǔ)法上的簡(jiǎn)潔顯然不足以成為一個(gè)編程語(yǔ)言拿來(lái)吹噓的資本,下文我們將對(duì)在這幾行語(yǔ)句下 Golang 的并發(fā)機(jī)制和實(shí)現(xiàn)進(jìn)行詳細(xì)探索。

一等公民-Goroutine

Goroutine 是 Go 的并發(fā)機(jī)制中絕對(duì)的主角。它代表了指令流及其執(zhí)行環(huán)境,也是被調(diào)度的基本單位。宏觀來(lái)看,goroutine 類(lèi)似操作系統(tǒng)中線(xiàn)程的概念(注意這里的類(lèi)比并不嚴(yán)格,下文將會(huì)對(duì)兩者做出詳細(xì)比較):不同線(xiàn)程間共享同一個(gè)內(nèi)存空間,但不共享?xiàng)G腋髯圆l(fā)執(zhí)行;同樣地,goroutine 也同內(nèi)存不同棧,并發(fā)運(yùn)行。

如上圖所示,上文代碼片段第四行的 go Hello()會(huì)創(chuàng)建一個(gè)新的 goroutine(綠色線(xiàn)條),并開(kāi)始執(zhí)行 Hello()函數(shù)。需要注意的是,由于主 goroutine(藍(lán)色線(xiàn)條)和新創(chuàng)建的 goroutine 擁有并發(fā)性,且主 goroutine 在執(zhí)行 go Hello()時(shí)并不會(huì)等待被調(diào)用函數(shù)執(zhí)行結(jié)束,故“I‘m A”(主 goroutine 輸出)和“I’m B”(新 goroutine 輸出)可能以任何順序交錯(cuò)展現(xiàn)。

為何不用線(xiàn)程 (pThread)?

直到現(xiàn)在,我們并不能從 goroutine 中看到任何有別于 thread、從而促成 Golang 編寫(xiě)者拋棄傳統(tǒng)的線(xiàn)程模型自己造輪子的地方。那么操作系統(tǒng)層面的線(xiàn)程 (pThread) 有什么問(wèn)題呢?

生命周期開(kāi)銷(xiāo)太高

線(xiàn)程的創(chuàng)建、銷(xiāo)毀和切換都需要一系列系統(tǒng)調(diào)用,而每一個(gè)系統(tǒng)調(diào)用意味著觸發(fā)軟中斷、進(jìn)入內(nèi)核態(tài)、將寄存器的值全部存入內(nèi)存、維護(hù)相關(guān)數(shù)據(jù)結(jié)構(gòu)、恢復(fù)寄存器、返回用戶(hù)態(tài)等一系列組合拳。這一輪操作不僅十分耗時(shí)、還可能讓內(nèi)存緩存的加速效果大幅度下滑。所以,避免頻繁創(chuàng)建、銷(xiāo)毀線(xiàn)程作為高性能并發(fā)的必要條件這一點(diǎn)已成為程序員的共識(shí)。

以線(xiàn)程為并發(fā)模型的 C/C++/Java 采用線(xiàn)程池的方法來(lái)降低線(xiàn)程昂貴的生命周期開(kāi)銷(xiāo)。既然線(xiàn)程創(chuàng)建/死亡代價(jià)高昂,我們何不讓創(chuàng)建的線(xiàn)程永不死亡呢?具體來(lái)說(shuō),對(duì)于每個(gè)已經(jīng)創(chuàng)建但已經(jīng)完成工作的線(xiàn)程,我們令其休眠,并放進(jìn)一個(gè)資源池中,在下次需要新的線(xiàn)程的時(shí)候,我們直接將線(xiàn)程池中休眠的線(xiàn)程拿出來(lái)喚醒使用而非新建線(xiàn)程。

這樣一來(lái),絕大部分的線(xiàn)程創(chuàng)建/銷(xiāo)毀需求都成功地被線(xiàn)程池吸收了。進(jìn)一步,通過(guò)規(guī)定線(xiàn)程池的最大容量,我們可以將花費(fèi)在線(xiàn)程創(chuàng)建和銷(xiāo)毀上的開(kāi)銷(xiāo)控制在固定值,例如,常見(jiàn)的 Java Web 應(yīng)用會(huì)設(shè)立一個(gè) 30~50 大小的線(xiàn)程池來(lái)處理 HTTP 請(qǐng)求,并取得非常好的并發(fā)效果。

不必要的線(xiàn)程切換

即使線(xiàn)程池很好地砍掉了線(xiàn)程生命周期開(kāi)銷(xiāo),操作系統(tǒng)層面的線(xiàn)程依然存在不足:線(xiàn)程的語(yǔ)義在于并行,當(dāng)線(xiàn)程數(shù)超出 CPU 核心數(shù)時(shí),操作系統(tǒng)會(huì)定時(shí)給每個(gè) CPU 核心切換不同的線(xiàn)程,讓他們“看上去”是同時(shí)在進(jìn)行的。當(dāng)然,這樣的切換同樣需要付出若干中斷、系統(tǒng)調(diào)用,以及當(dāng)前線(xiàn)程的工作集從緩存中被新線(xiàn)程完全抹去的代價(jià)。

乍一聽(tīng)上去這樣的代價(jià)是必不可少的,實(shí)則不然。由于在絕大部分時(shí)候我們的應(yīng)用都是 I/O 和計(jì)算混合的,即,一段時(shí)間與硬盤(pán)/網(wǎng)絡(luò)交互(I/O)、一段時(shí)間進(jìn)行相對(duì)密集的內(nèi)存訪(fǎng)問(wèn)和計(jì)算,而等待 I/O 完成期間該線(xiàn)程處于休眠狀態(tài)。

CPU 已經(jīng)會(huì)切換到其他線(xiàn)程,即使操作系統(tǒng)不強(qiáng)行打斷并切換處于計(jì)算密集期的線(xiàn)程,應(yīng)用在宏觀上依然顯示出一定并發(fā)性。而通過(guò)去掉計(jì)算密集期的線(xiàn)程切換,整體 CPU 效率得到了有效提升——NodeJS 就是在這樣的哲學(xué)下誕生的:?jiǎn)我痪€(xiàn)程、全異步的 I/O、事件驅(qū)動(dòng)、非搶占式調(diào)度(當(dāng)某一個(gè)函數(shù)單純進(jìn)行計(jì)算和內(nèi)存訪(fǎng)問(wèn)時(shí)不會(huì)被打斷)。

在進(jìn)行 I/O 密集型工作(如網(wǎng)站后臺(tái))時(shí)通過(guò)將單一 CPU 利用率逼到 100%的方式在效率上力挫幾乎其他所有能利用多線(xiàn)程多核腳本語(yǔ)言。這簡(jiǎn)直是本來(lái)就特立獨(dú)行的 Javascript 對(duì)整個(gè)編程語(yǔ)言界的同僚豎起的又一根中指。當(dāng)然了,僅僅能利用單核處理能力的 NodeJS 在處理對(duì)計(jì)算要求更高的工作上顯然會(huì)力不從心,但其給我們的啟示值得注意。

較高的切換開(kāi)銷(xiāo)

在鎖競(jìng)爭(zhēng)、協(xié)程同步等情況下,頻繁進(jìn)入內(nèi)核態(tài)的線(xiàn)程模型會(huì)放大自身在切換開(kāi)銷(xiāo)上的劣勢(shì)。而用戶(hù)態(tài)的調(diào)度器(如 goroutine 調(diào)度器)則可以在用戶(hù)態(tài)處理這一切,省時(shí)省力。另外,由于編程語(yǔ)言能夠更好地對(duì)自己語(yǔ)言中的同步原語(yǔ)進(jìn)行分析,編程語(yǔ)言自己的調(diào)度器能夠更好地根據(jù)語(yǔ)義對(duì)調(diào)度進(jìn)行優(yōu)化。

Goroutine 調(diào)度模型

Go 使用用戶(hù)態(tài)的調(diào)度器對(duì) goroutine 的執(zhí)行進(jìn)行控制,從而避免了大部分內(nèi)核開(kāi)銷(xiāo)。具體而言,Golang 的調(diào)度模型由三部分組成:執(zhí)行環(huán)境 (Executor)、調(diào)度器 (Scheduler) 和 goroutine。

執(zhí)行環(huán)境,顧名思義,用來(lái)執(zhí)行代碼。盡管其在抽象概念上應(yīng)該對(duì)應(yīng)一個(gè) CPU 核心,但由于在用戶(hù)態(tài)不能接觸硬件資源,故 Go 將其具體實(shí)現(xiàn)為線(xiàn)程。當(dāng)線(xiàn)程數(shù)等于 CPU 核心數(shù)時(shí),既最大化了 CPU 核心利用率,又最小化了線(xiàn)程切換的開(kāi)銷(xiāo),是最理想的情況(當(dāng)然,實(shí)際情況下操作系統(tǒng)還會(huì)運(yùn)行、切換來(lái)自其他進(jìn)程的線(xiàn)程,但這已經(jīng)超出一個(gè)普通程序的控制范疇)。

故默認(rèn)情況下,用于指定執(zhí)行環(huán)境個(gè)數(shù)的運(yùn)行時(shí)變量 GOMAXPROCS等于 CPU 核心數(shù)目。當(dāng)然,開(kāi)發(fā)者可以根據(jù)自己的需求更改該值,當(dāng) GOMAXPROCS=1時(shí),Go 的執(zhí)行模型幾乎等同于 NodeJS。

調(diào)度器則是調(diào)度模型的核心,它決定了每個(gè)執(zhí)行環(huán)境(核)在什么時(shí)候執(zhí)行什么樣的 goroutine。Go 采用任務(wù)隊(duì)列的方式對(duì) goroutine 進(jìn)行調(diào)度:

4a01a970-ee00-11eb-a97a-12bb97331649.png

如上圖所示,所有 goroutine 作為任務(wù)排在任務(wù)隊(duì)列中,而 scheduler 所做的則是在 executor 空閑時(shí)從隊(duì)首拿出下一個(gè) goroutine 給其執(zhí)行。每個(gè)任務(wù) (goroutine) 會(huì)被 executor 執(zhí)行到完成或阻塞(如發(fā)起 I/O 請(qǐng)求、系統(tǒng)調(diào)用、請(qǐng)求一個(gè)正在被其他人使用的鎖或自行 yield 計(jì)算資源等)。

在第二種情況下,該 goroutine 既不在 executor 也不在隊(duì)列中,而是處于阻塞態(tài)被 Scheduler 監(jiān)視直到阻塞結(jié)束重新入隊(duì)。值得注意的是,這里與上文提到的“去掉計(jì)算密集期的線(xiàn)程切換”的聯(lián)系:由于調(diào)度器對(duì)任務(wù)采用非搶占式調(diào)度,即在正常計(jì)算和內(nèi)存訪(fǎng)問(wèn)的情況下 executor 不會(huì)放棄當(dāng)前 goroutine,故多余的 goroutine 切換代價(jià)得以被去除。

這樣的任務(wù)隊(duì)列模型仍然存在不小的問(wèn)題:由于任務(wù)隊(duì)列只有一個(gè),為了保證出入隊(duì)的原子性,任務(wù)分配/加入時(shí)需要對(duì)整個(gè)隊(duì)列加互斥鎖,當(dāng) goroutine 執(zhí)行時(shí)間短時(shí),頻繁給大量 executor 分配新任務(wù)會(huì)讓單一隊(duì)列成為并行的性能瓶頸。為了解決該問(wèn)題,Go 采用了多任務(wù)隊(duì)列的方式進(jìn)行任務(wù)調(diào)度:

4a2fe042-ee00-11eb-a97a-12bb97331649.png

如上圖所示,在多任務(wù)調(diào)度模型中,每個(gè) executor 均有一個(gè)自己對(duì)應(yīng)的任務(wù)隊(duì)列。在正常情況下,每個(gè) executor 從自己的隊(duì)列中拿 goroutine,并將生成的新 goroutine 放進(jìn)自己隊(duì)列隊(duì)尾。分布式結(jié)構(gòu)可能帶來(lái)的問(wèn)題是顯而易見(jiàn)的:

如果任務(wù)在隊(duì)列的分布不均勻會(huì)導(dǎo)致計(jì)算資源的浪費(fèi),如上圖中的 executor3,如果缺乏其他措施,該核會(huì)因?yàn)閷?duì)應(yīng)隊(duì)列沒(méi)有任務(wù)而空閑。對(duì)于該問(wèn)題,Go 的解決方法是引入“偷任務(wù)”機(jī)制:當(dāng) Scheduler 發(fā)現(xiàn)某隊(duì)列無(wú)任務(wù)可用時(shí),會(huì)從其他隊(duì)列里“偷”一部分任務(wù)過(guò)來(lái)。由于偷任務(wù)的代價(jià)較高(需要鎖兩個(gè)隊(duì)列),Scheduler 會(huì)爭(zhēng)取一次性偷足夠多的任務(wù)以降低未來(lái)偷任務(wù)的頻率。

而對(duì)于處于阻塞狀態(tài)的 goroutine,Scheduler 需要監(jiān)視其脫離阻塞狀態(tài)并重新入隊(duì)。Goroutine 被阻塞的原因大體分兩種:

阻塞 I/O 或系統(tǒng)調(diào)用。由于底層實(shí)現(xiàn)限制,該類(lèi)阻塞需要一個(gè)線(xiàn)程顯式執(zhí)行相應(yīng)的 syscall 并等待調(diào)用返回。在這種情況下,Scheduler 會(huì)新建一個(gè)線(xiàn)程執(zhí)行該 syscall,并在返回后通知 Scheduler。

同樣地,為了節(jié)省開(kāi)銷(xiāo),該線(xiàn)程被維護(hù)在線(xiàn)程池中。值得注意的是,該類(lèi)線(xiàn)程由于整個(gè)生命周期都幾乎在等待阻塞(阻塞結(jié)束后立即通知 Scheduler 而后結(jié)束),而阻塞的線(xiàn)程是不參與操作系統(tǒng)線(xiàn)程切換的,故其并不會(huì)帶來(lái)太大的線(xiàn)程切換開(kāi)銷(xiāo)。

當(dāng)然,如果借鑒 NodeJS、盡可能用異步版本 api 替換同步版,則可以省去線(xiàn)程池操作,進(jìn)一步優(yōu)化性能(Go 是否采用該優(yōu)化尚存疑)。

內(nèi)部同步機(jī)制,Goroutine 因?yàn)檎{(diào)用了 Go 內(nèi)部同步機(jī)制(channel、互斥鎖、wait group、conditional variable 等)而阻塞。對(duì)于此類(lèi)阻塞,由于同步機(jī)制的語(yǔ)義是 Go 定義從而對(duì) Scheduler 透明的,Scheduler 可以分析出阻塞依賴(lài),從而將監(jiān)視該阻塞狀態(tài)的任務(wù)交給其依賴(lài)的 goroutine。

例如,goroutine A 請(qǐng)求了一個(gè)正被 goroutine B 獲取了的互斥鎖,從而陷入阻塞,那么 Scheduler 可以在 goroutine B 釋放該鎖時(shí)由對(duì)應(yīng)的 executor 將 goroutine A 喚醒并加入隊(duì)列。在這整個(gè)過(guò)程中不需要引入新的線(xiàn)程。

以上便是 Golang Scheduler 的大致工作邏輯,在各個(gè)組件的相互配合下,一個(gè)高性能、支持調(diào)度成千上萬(wàn) goroutine 的并發(fā)環(huán)境就此搭建起來(lái)。

總結(jié)和啟發(fā)

從 Golang 的并發(fā)機(jī)制中我們可以得到如下幾點(diǎn)啟發(fā):

系統(tǒng)調(diào)用和內(nèi)核態(tài)是昂貴的,用戶(hù)態(tài)的調(diào)度器擁有更好的性能。

由于頻繁進(jìn)行不必要的切換,線(xiàn)程并不是合適的并發(fā)執(zhí)行基本單位;相反,將線(xiàn)程作為執(zhí)行資源 (CPU) 的抽象、為一個(gè) CPU 核心建立一個(gè)線(xiàn)程作為執(zhí)行器則是一個(gè)很不錯(cuò)的主意。

單一任務(wù)隊(duì)列在任務(wù)短而多時(shí)劣勢(shì)明顯,分布式隊(duì)列+任務(wù)偷取能夠較好的解決問(wèn)題。

可以說(shuō),Golang 的并發(fā)機(jī)制是 NodeJS 的普適版,擁有能夠更好利用多核計(jì)算力的優(yōu)勢(shì);和 采用 OS 線(xiàn)程、阻塞 I/O、GIL 的 Python 并發(fā)模式 相比則更是云泥之別。正是更為精巧的并發(fā)機(jī)制和簡(jiǎn)單的并發(fā)原語(yǔ),使得 Concurrency 成為 Go 語(yǔ)言最大的賣(mài)點(diǎn)。

需要指出的是,Go 所采用的一切技術(shù)都并非原創(chuàng)—— go func()的同步原語(yǔ)與 Cilk 十分類(lèi)似,分布式任務(wù)隊(duì)列也多少有模仿 Cilk/OpenMP 的意味,如果非要說(shuō)不同之處,大概在于 Go 是一個(gè)原生支持該功能的完整編程語(yǔ)言,而另外兩者只是 C/C++的語(yǔ)法擴(kuò)展插件吧。

文章轉(zhuǎn)載:Go開(kāi)發(fā)大全

(版權(quán)歸原作者所有,侵刪)

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 語(yǔ)言
    +關(guān)注

    關(guān)注

    1

    文章

    97

    瀏覽量

    24503

原文標(biāo)題:Golang 學(xué)習(xí)之并發(fā)機(jī)制

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙5開(kāi)發(fā)寶藏案例分享---應(yīng)用并發(fā)設(shè)計(jì)

    到性能調(diào)優(yōu),這些案例都是華為工程師的血淚經(jīng)驗(yàn)結(jié)晶。下面用最直白的語(yǔ)言+代碼示例,帶你玩轉(zhuǎn)HarmonyOS并發(fā)開(kāi)發(fā)! ?一、ArkTS并發(fā)模型:顛覆傳統(tǒng)的設(shè)計(jì) 傳統(tǒng)模型痛點(diǎn) graph LR A[共享
    發(fā)表于 06-12 16:19

    Java的SPI機(jī)制詳解

    作者:京東物流 楊葦葦 1.SPI簡(jiǎn)介 SPI(Service Provicer Interface)是Java語(yǔ)言提供的一種接口發(fā)現(xiàn)機(jī)制,用來(lái)實(shí)現(xiàn)接口和接口實(shí)現(xiàn)的解耦。簡(jiǎn)單來(lái)說(shuō),就是
    的頭像 發(fā)表于 03-05 11:35 ?792次閱讀
    Java的SPI<b class='flag-5'>機(jī)制</b>詳解

    數(shù)字電路編程語(yǔ)言介紹

    文本形式描述電路的行為和結(jié)構(gòu)。 并行性和并發(fā)性 :數(shù)字電路編程語(yǔ)言支持并行和并發(fā)操作的描述,這是數(shù)字電路設(shè)計(jì)中的基本特性。 模塊化 :這些語(yǔ)言支持模塊化設(shè)計(jì),允許設(shè)計(jì)師將復(fù)雜的電路分解
    的頭像 發(fā)表于 01-24 09:39 ?783次閱讀

    EE-188:使用C語(yǔ)言ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng)

    電子發(fā)燒友網(wǎng)站提供《EE-188:使用C語(yǔ)言ADSP-219x DSP上實(shí)現(xiàn)中斷驅(qū)動(dòng)系統(tǒng).pdf》資料免費(fèi)下載
    發(fā)表于 01-15 16:06 ?0次下載
    EE-188:使用C<b class='flag-5'>語(yǔ)言</b><b class='flag-5'>在</b>ADSP-219x DSP上<b class='flag-5'>實(shí)現(xiàn)</b>中斷驅(qū)動(dòng)系統(tǒng)

    什么是LLM?LLM自然語(yǔ)言處理中的應(yīng)用

    所未有的精度和效率處理和生成自然語(yǔ)言。 LLM的基本原理 LLM基于深度學(xué)習(xí)技術(shù),尤其是變換器(Transformer)架構(gòu)。變換器模型因其自注意力(Self-Attention)機(jī)制而聞名,這種機(jī)制使得模型能夠捕捉文本中的長(zhǎng)距
    的頭像 發(fā)表于 11-19 15:32 ?3668次閱讀

    Golang配置代理方法

    由于一些客觀原因的存在,我們開(kāi)發(fā) Golang 項(xiàng)目的過(guò)程總會(huì)碰到無(wú)法下載某些依賴(lài)包的問(wèn)題。這不是一個(gè)小問(wèn)題,因?yàn)槟愕墓ぷ鲿?huì)被打斷,即便你使用各種神通解決了問(wèn)題,很可能這時(shí)你的線(xiàn)程已經(jīng)切換到其他的事情上了(痛恨思路被打斷!)。所以最好是一開(kāi)始我們就重視這個(gè)問(wèn)題,并一勞永逸
    的頭像 發(fā)表于 11-11 11:17 ?1042次閱讀
    <b class='flag-5'>Golang</b>配置代理方法

    C語(yǔ)言其他編程語(yǔ)言的比較

    C語(yǔ)言作為一種歷史悠久的編程語(yǔ)言,自其誕生以來(lái),一直軟件開(kāi)發(fā)領(lǐng)域扮演著重要角色。它以其高效、靈活和可移植性強(qiáng)的特點(diǎn),成為了系統(tǒng)級(jí)編程的首選語(yǔ)言之一。
    的頭像 發(fā)表于 10-29 17:30 ?1089次閱讀

    Llama 3 模型與其他AI工具對(duì)比

    、技術(shù)架構(gòu) Llama 3模型 采用了最新的Transformer架構(gòu),并結(jié)合了自注意力機(jī)制和分組查詢(xún)關(guān)注(GQA)機(jī)制。 引入了高效的tokenizer和RoPE位置編碼,提高了語(yǔ)言編碼和長(zhǎng)文
    的頭像 發(fā)表于 10-27 14:37 ?1073次閱讀

    go語(yǔ)言如何解決并發(fā)問(wèn)題

    作為一個(gè)后端開(kāi)發(fā),日常工作中接觸最多的兩門(mén)語(yǔ)言就是PHP和GO了。無(wú)可否認(rèn),PHP確實(shí)是最好的語(yǔ)言(手動(dòng)狗頭哈哈),寫(xiě)起來(lái)真的很舒爽,沒(méi)有任何心智負(fù)擔(dān),字符串和整型壓根就不用區(qū)分,開(kāi)發(fā)速度真的是比
    的頭像 發(fā)表于 10-23 13:38 ?516次閱讀
    go<b class='flag-5'>語(yǔ)言</b>如何解決<b class='flag-5'>并發(fā)</b>問(wèn)題

    【米爾NXP i.MX 93開(kāi)發(fā)板試用評(píng)測(cè)】4、使用golang搭建Modbus 服務(wù)器

    golang程序。我們可以官網(wǎng)上下載aarch64,也就是arm64平臺(tái)的壓縮包 使用以下的指令 wget https://golang.google.cn/dl
    發(fā)表于 09-21 22:51

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-初識(shí)倉(cāng)頡開(kāi)發(fā)語(yǔ)言

    輕量化線(xiàn)程(原生協(xié)程),以及簡(jiǎn)單易用的并發(fā)編程機(jī)制,保證并發(fā)場(chǎng)景的高效開(kāi)發(fā)和運(yùn)行。 兼容語(yǔ)言生態(tài) :倉(cāng)頡編程語(yǔ)言支持和 C 等主流編程
    發(fā)表于 08-15 10:00

    三十分鐘入門(mén)基礎(chǔ)Go Java小子版

    語(yǔ)法與 C 相近,但功能上有:內(nèi)存安全,GC,結(jié)構(gòu)形態(tài)及 CSP-style 并發(fā)計(jì)算。 適用范圍 本篇文章適用于學(xué)習(xí)過(guò)其他面向?qū)ο?b class='flag-5'>語(yǔ)言(Java、Php),但沒(méi)有學(xué)過(guò)Go
    的頭像 發(fā)表于 08-12 14:32 ?994次閱讀
    三十分鐘入門(mén)基礎(chǔ)Go Java小子版

    倉(cāng)頡語(yǔ)言書(shū)籍申請(qǐng)

    這兩個(gè)語(yǔ)言一些性能優(yōu)缺點(diǎn)之后,我發(fā)現(xiàn)倉(cāng)頡語(yǔ)言是未來(lái)的趨勢(shì),倉(cāng)頡語(yǔ)言的高效編程、輕松并發(fā)、全場(chǎng)景應(yīng)用開(kāi)發(fā)的特點(diǎn)我特別感興趣。 作為華為自主研發(fā)的語(yǔ)言
    發(fā)表于 08-06 08:37

    【《大語(yǔ)言模型應(yīng)用指南》閱讀體驗(yàn)】+ 基礎(chǔ)知識(shí)學(xué)習(xí)

    今天來(lái)學(xué)習(xí)大語(yǔ)言模型自然語(yǔ)言理解方面的原理以及問(wèn)答回復(fù)實(shí)現(xiàn)。 主要是基于深度學(xué)習(xí)和自然語(yǔ)言處理技術(shù)。 大
    發(fā)表于 08-02 11:03

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-初識(shí)倉(cāng)頡開(kāi)發(fā)語(yǔ)言

    輕量化線(xiàn)程(原生協(xié)程),以及簡(jiǎn)單易用的并發(fā)編程機(jī)制,保證并發(fā)場(chǎng)景的高效開(kāi)發(fā)和運(yùn)行。 兼容語(yǔ)言生態(tài) :倉(cāng)頡編程語(yǔ)言支持和C 等主流編程
    發(fā)表于 07-30 17:49