欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(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 最大的賣點(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)建了兩線并發(fā)的程序。

相較于 C/C++/Java/Python 等語(yǔ)言為了創(chuàng)建一個(gè)并發(fā)執(zhí)行環(huán)境所需要的調(diào)用 POSIX-API/定義繼承類等繁瑣步驟,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 類似操作系統(tǒng)中線程的概念(注意這里的類比并不嚴(yán)格,下文將會(huì)對(duì)兩者做出詳細(xì)比較):不同線程間共享同一個(gè)內(nèi)存空間,但不共享?xiàng)G腋髯圆l(fā)執(zhí)行;同樣地,goroutine 也同內(nèi)存不同棧,并發(fā)運(yùn)行。

如上圖所示,上文代碼片段第四行的 go Hello()會(huì)創(chuàng)建一個(gè)新的 goroutine(綠色線條),并開(kāi)始執(zhí)行 Hello()函數(shù)。需要注意的是,由于主 goroutine(藍(lá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)。

為何不用線程 (pThread)?

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

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

線程的創(chuàng)建、銷毀和切換都需要一系列系統(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ù)寄存器、返回用戶態(tài)等一系列組合拳。這一輪操作不僅十分耗時(shí)、還可能讓內(nèi)存緩存的加速效果大幅度下滑。所以,避免頻繁創(chuàng)建、銷毀線程作為高性能并發(fā)的必要條件這一點(diǎn)已成為程序員的共識(shí)。

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

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

不必要的線程切換

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

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

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

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

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

在鎖競(jìng)爭(zhēng)、協(xié)程同步等情況下,頻繁進(jìn)入內(nèi)核態(tài)的線程模型會(huì)放大自身在切換開(kāi)銷上的劣勢(shì)。而用戶態(tài)的調(diào)度器(如 goroutine 調(diào)度器)則可以在用戶態(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 使用用戶態(tài)的調(diào)度器對(duì) goroutine 的執(zhí)行進(jìn)行控制,從而避免了大部分內(nèi)核開(kāi)銷。具體而言,Golang 的調(diào)度模型由三部分組成:執(zhí)行環(huán)境 (Executor)、調(diào)度器 (Scheduler) 和 goroutine。

執(zhí)行環(huán)境,顧名思義,用來(lái)執(zhí)行代碼。盡管其在抽象概念上應(yīng)該對(duì)應(yīng)一個(gè) CPU 核心,但由于在用戶態(tài)不能接觸硬件資源,故 Go 將其具體實(shí)現(xiàn)為線程。當(dāng)線程數(shù)等于 CPU 核心數(shù)時(shí),既最大化了 CPU 核心利用率,又最小化了線程切換的開(kāi)銷,是最理想的情況(當(dāng)然,實(shí)際情況下操作系統(tǒng)還會(huì)運(yùn)行、切換來(lái)自其他進(jì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ì)算密集期的線程切換”的聯(lián)系:由于調(diào)度器對(duì)任務(wù)采用非搶占式調(diào)度,即在正常計(jì)算和內(nèi)存訪問(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)限制,該類阻塞需要一個(gè)線程顯式執(zhí)行相應(yīng)的 syscall 并等待調(diào)用返回。在這種情況下,Scheduler 會(huì)新建一個(gè)線程執(zhí)行該 syscall,并在返回后通知 Scheduler。

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

當(dāng)然,如果借鑒 NodeJS、盡可能用異步版本 api 替換同步版,則可以省去線程池操作,進(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ì)于此類阻塞,由于同步機(jī)制的語(yǔ)義是 Go 定義從而對(duì) Scheduler 透明的,Scheduler 可以分析出阻塞依賴,從而將監(jiān)視該阻塞狀態(tài)的任務(wù)交給其依賴的 goroutine。

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

以上便是 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)是昂貴的,用戶態(tài)的調(diào)度器擁有更好的性能。

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

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

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

需要指出的是,Go 所采用的一切技術(shù)都并非原創(chuàng)—— go func()的同步原語(yǔ)與 Cilk 十分類似,分布式任務(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

    瀏覽量

    24292

原文標(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)推薦

    什么是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 ?1352次閱讀

    Golang配置代理方法

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

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

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

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

    作為一個(gè)后端開(kāi)發(fā),日常工作中接觸最多的兩門語(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 ?181次閱讀
    go<b class='flag-5'>語(yǔ)言</b>如何解決<b class='flag-5'>并發(fā)</b>問(wèn)題

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

    輕量化線程(原生協(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

    三十分鐘入門基礎(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 ?788次閱讀
    三十分鐘入門基礎(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é)程),以及簡(jiǎn)單易用的并發(fā)編程機(jī)制,保證并發(fā)場(chǎng)景的高效開(kāi)發(fā)和運(yùn)行。 兼容語(yǔ)言生態(tài) :倉(cāng)頡編程語(yǔ)言支持和C 等主流編程
    發(fā)表于 07-30 17:49

    Transformer語(yǔ)言模型簡(jiǎn)介與實(shí)現(xiàn)過(guò)程

    任務(wù),隨后迅速擴(kuò)展到其他NLP任務(wù)中,如文本生成、語(yǔ)言理解、問(wèn)答系統(tǒng)等。本文將詳細(xì)介紹Transformer語(yǔ)言模型的原理、特點(diǎn)、優(yōu)勢(shì)以及實(shí)現(xiàn)過(guò)程。
    的頭像 發(fā)表于 07-10 11:48 ?2100次閱讀

    Golang為何舍棄三元運(yùn)算符

    golang中不存在?:運(yùn)算符的原因是因?yàn)?b class='flag-5'>語(yǔ)言設(shè)計(jì)者已經(jīng)預(yù)見(jiàn)到三元運(yùn)算符經(jīng)常被用來(lái)構(gòu)建一些極其復(fù)雜的表達(dá)式。雖然使用if進(jìn)行替代會(huì)讓代碼顯得更長(zhǎng),但這毫無(wú)疑問(wèn)可讀性更強(qiáng)。
    的頭像 發(fā)表于 04-03 15:13 ?764次閱讀

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程并發(fā)概述

    并發(fā)模型是用來(lái)實(shí)現(xiàn)不同應(yīng)用場(chǎng)景中并發(fā)任務(wù)的編程模型,常見(jiàn)的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基于消息通信的
    發(fā)表于 03-28 14:35

    鴻蒙原生應(yīng)用開(kāi)發(fā)-ArkTS語(yǔ)言基礎(chǔ)類庫(kù)多線程并發(fā)概述

    并發(fā)模型是用來(lái)實(shí)現(xiàn)不同應(yīng)用場(chǎng)景中并發(fā)任務(wù)的編程模型,常見(jiàn)的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基于消息通信的
    發(fā)表于 03-22 15:40

    verilog與其他編程語(yǔ)言的接口機(jī)制

    Verilog是一種硬件描述語(yǔ)言,用于描述數(shù)字電路的行為和結(jié)構(gòu)。與其他編程語(yǔ)言相比,Verilog具有與硬件緊密結(jié)合的特點(diǎn),因此其接口機(jī)制也有一些與眾不同之處。本文將詳細(xì)介紹Veril
    的頭像 發(fā)表于 02-23 10:22 ?776次閱讀