cari
Rumahpembangunan bahagian belakangGolangAdakah single-threading merupakan ciri bahasa Go?

Adakah single-threading merupakan ciri bahasa Go?

Jan 06, 2023 am 11:17 AM
golangpergi bahasa

Benang tunggal bukan ciri bahasa go, bahasa go adalah berbilang benang. Model utas Golang ialah model MPG Secara keseluruhannya, proses Go dan utas kernel mempunyai surat-menyurat banyak-ke-banyak, jadi Go mestilah dalam mod berbilang utas dan utas kernel sepadan dengan 1 hingga 1, dan berbilang Gs sepadan dengan berbilang M Sejajar dengan itu, P merujuk kepada sumber konteks.

Adakah single-threading merupakan ciri bahasa Go?

Persekitaran pengendalian tutorial ini: sistem Windows 7, GO versi 1.18, komputer Dell G3.

Benang tunggal bukan ciri bahasa go, bahasa go adalah berbilang benang. Jika ia adalah satu benang, bagaimana boleh dikatakan bahawa ia adalah bahasa yang dilahirkan untuk kesesuaian tinggi dalam era berbilang teras?

Model belitan Golang ialah model MPG Secara umum, proses Go dan utas kernel sepadan dengan banyak-ke-banyak, jadi pertama sekali, mereka mesti berbilang benang. Antaranya, M sepadan dengan utas kernel 1:1, dan kemudian berbilang G sepadan dengan berbilang M. P merujuk kepada sumber konteks, tidak banyak yang perlu diperkatakan. Bilakah bilangan M (atau benang kernel) meningkat? Iaitu, apabila nombor semasa M tidak boleh dijadualkan untuk memindahkan semua G semasa, M baharu akan digunakan untuk memprosesnya.

Go concurrency (multi-threading)

Sesetengah orang membandingkan Go dengan bahasa C abad ke-21 Pertama, ini kerana bahasa Go adalah reka bentuk yang ringkas . Kedua, ia adalah bahasa yang paling popular pada abad ke-21 Yang penting ialah pengaturcaraan selari, dan Go menyokong keselarian dari peringkat bahasa.

goroutine

goroutine ialah teras reka bentuk selari Go. Dalam analisis akhir, goroutine sebenarnya adalah benang, tetapi ia lebih kecil daripada sedozen goroutine mungkin ditunjukkan dalam lima atau enam utas di bahagian bawah bahasa The Go membantu anda merealisasikan perkongsian memori antara goroutine ini. Melaksanakan goroutine memerlukan memori tindanan yang sangat sedikit (kira-kira 4~5KB), dan sudah tentu ia akan berskala mengikut data yang sepadan. Disebabkan ini, beribu-ribu tugas serentak boleh dijalankan serentak. Goroutine lebih mudah digunakan, lebih cekap dan lebih ringan daripada benang.

Goroutine ialah pengurus rangkaian yang diuruskan oleh masa jalan Go. Goroutine dilaksanakan melalui kata kunci go, yang sebenarnya merupakan fungsi biasa.

go hello(a, b, c)

Groutine dimulakan dengan menggunakan kata kunci go. Mari kita lihat contoh

package main

import (
    "fmt"
    "runtime"
)

func say(s string) {
    for i := 0; i <p> Kita dapat melihat bahawa kata kunci go boleh melaksanakan pengaturcaraan serentak dengan mudah. Berbilang goroutine di atas berjalan dalam proses yang sama dan berkongsi data memori Walau bagaimanapun, kita mesti mengikut reka bentuk: jangan berkomunikasi melalui perkongsian, tetapi berkongsi melalui komunikasi. </p><blockquote>
<p>runtime.Gosched() bermaksud membiarkan CPU menyerahkan potongan masa kepada orang lain dan terus menyambung semula pelaksanaan goroutine pada masa yang akan datang. </p>
<p>Secara lalai, penjadual hanya menggunakan satu urutan, yang bermaksud bahawa hanya konkurensi dilaksanakan. Untuk memanfaatkan keselarian pemproses berbilang teras, kami perlu memanggil masa jalan secara eksplisit.GOMAXPROCS(n) dalam program kami untuk memberitahu penjadual menggunakan berbilang benang pada masa yang sama. GOMAXPROCS menetapkan bilangan maksimum rangkaian sistem yang boleh menjalankan kod logik secara serentak dan mengembalikan tetapan sebelumnya. Jika n </p>
</blockquote><p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#channels" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">saluran</span></strong></p><p>goroutine dijalankan dalam ruang alamat yang sama, jadi akses kepada memori dikongsi mesti disegerakkan . Jadi bagaimana untuk menyampaikan data antara goroutine Go menyediakan saluran mekanisme komunikasi yang baik. Saluran boleh dibandingkan dengan paip dwiarah dalam cangkerang Unix: anda boleh menghantar atau menerima nilai melaluinya. Nilai ini hanya boleh daripada jenis tertentu: jenis saluran. Apabila anda menentukan saluran, anda juga perlu menentukan jenis nilai yang dihantar ke saluran. Ambil perhatian bahawa saluran mesti dibuat menggunakan make: </p><pre class="brush:php;toolbar:false">ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

Saluran menerima dan menghantar data melalui operator

ch <p> Mari kita gunakan ini pada contoh kita: </p> <pre class="brush:php;toolbar:false">package main

import "fmt"

func sum(a []int, c chan int) {
    total := 0
    for _, v := range a {
        total += v
    }
    c <p>Secara lalai, penerimaan saluran dan penghantaran data disekat melainkan hujung satu lagi sudah sedia, yang menjadikan penyegerakan Goroutines lebih mudah tanpa memerlukan kunci yang jelas. Sekatan yang dipanggil bermakna jika anda membaca (nilai := </p><p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#buffered-channels" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">Saluran Penampan</span></strong></p><p>Kami memperkenalkan saluran jenis bukan cache lalai di atas, tetapi Go juga membenarkan menentukan saluran saiz penimbal ialah berapa banyak elemen yang boleh disimpan oleh saluran. ch:= make(chan bool, 4), mencipta saluran bool yang boleh menyimpan 4 elemen. Dalam saluran ini, 4 elemen pertama boleh ditulis tanpa menyekat. Apabila elemen ke-5 ditulis, kod akan disekat sehingga goroutine lain membaca beberapa elemen dari saluran untuk memberi ruang. </p><pre class="brush:php;toolbar:false">ch := make(chan type, value)

value == 0 ! 无缓冲(阻塞)
value > 0 ! 缓冲(非阻塞,直到value 个元素)

我们看一下下面这个例子,你可以在自己本机测试一下,修改相应的value值

package main

import "fmt"

func main() {
    c := make(chan int, 2)//修改2为1就报错,修改2为3可以正常运行
    c <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#range%E5%92%8Cclose" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">Range和Close</span></strong></p><p>上面这个例子中,我们需要读取两次c,这样不是很方便,Go考虑到了这一点,所以也可以通过range,像操作slice或者map一样操作缓存类型的channel,请看下面的例子</p><pre class="brush:php;toolbar:false">package main

import (
    "fmt"
)

func fibonacci(n int, c chan int) {
    x, y := 1, 1
    for i := 0; i <p><code>for i := range c</code>能够不断的读取channel里面的数据,直到该channel被显式的关闭。上面代码我们看到可以显式的关闭channel,生产者通过内置函数<code>close</code>关闭channel。关闭channel之后就无法再发送任何数据了,在消费方可以通过语法<code>v, ok := 测试channel是否被关闭。如果ok返回false,那么说明channel已经没有任何数据并且已经被关闭。</code></p><blockquote>
<p>记住应该在生产者的地方关闭channel,而不是消费的地方去关闭它,这样容易引起panic</p>
<p>另外记住一点的就是channel不像文件之类的,不需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显式的结束range循环之类的</p>
</blockquote><p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#select" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">Select</span></strong></p><p>我们上面介绍的都是只有一个channel的情况,那么如果存在多个channel的时候,我们该如何操作呢,Go里面提供了一个关键字<code>select</code>,通过<code>select</code>可以监听channel上的数据流动。</p><p><code>select</code>默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。</p><pre class="brush:php;toolbar:false">package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 1, 1
    for {
        select {
        case c <p>在<code>select</code>里面还有default语法,<code>select</code>其实就是类似switch的功能,default就是当监听的channel都没有准备好的时候,默认执行的(select不再阻塞等待channel)。</p><pre class="brush:php;toolbar:false">select {
case i := <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#%E8%B6%85%E6%97%B6" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">超时</span></strong></p><p>有时候会出现goroutine阻塞的情况,那么我们如何避免整个程序进入阻塞的情况呢?我们可以利用select来设置超时,通过如下的方式实现:</p><pre class="brush:php;toolbar:false">func main() {
    c := make(chan int)
    o := make(chan bool)
    go func() {
        for {
            select {
                case v := <p><a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md#runtime-goroutine" rel="external nofollow" target="_blank"></a><strong><span style="font-size: 18px;">runtime goroutine</span></strong></p><p>runtime包中有几个处理goroutine的函数:</p>
  • Goexit

    退出当前执行的goroutine,但是defer函数还会继续调用

  • Gosched

    让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。

  • NumCPU

    返回 CPU 核数量

  • NumGoroutine

    返回正在执行和排队的任务总数

  • GOMAXPROCS

    用来设置可以并行计算的CPU核数的最大值,并返回之前的值。

【相关推荐:Go视频教程编程教学

Atas ialah kandungan terperinci Adakah single-threading merupakan ciri bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Antara muka dan polimorfisme di GO: Mencapai kebolehgunaan semula kodAntara muka dan polimorfisme di GO: Mencapai kebolehgunaan semula kodApr 29, 2025 am 12:31 AM

Interfacesandpolymorphismingoenhancecodereusabilityandmaintainability.1) DefineInterfacesatTheRightAbstractionLevel.2) UseInterfacesforddendencyInjection.3) ProfileCodeTanageperperformanceImpacts.

Apakah peranan fungsi 'init' dalam GO?Apakah peranan fungsi 'init' dalam GO?Apr 29, 2025 am 12:28 AM

TheinitfunctioningorunsautomaticallybeforethemainfunctiontoinitialializePackagesandsetuptheenvironment.it'susforforsettingupglobalvariables, sumber, danperformingone-timesetuptasksacrossanypackage

Komposisi antara muka di GO: Membina abstraksi kompleksKomposisi antara muka di GO: Membina abstraksi kompleksApr 29, 2025 am 12:24 AM

Kombinasi antara muka membina abstraksi kompleks dalam pengaturcaraan GO dengan memecahkan fungsi ke dalam antara muka kecil yang terfokus. 1) Tentukan pembaca, penulis dan antara muka yang lebih dekat. 2) Buat jenis kompleks seperti fail dan rangkaian dengan menggabungkan antara muka ini. 3) Gunakan fungsi ProcessData untuk menunjukkan cara mengendalikan antara muka gabungan ini. Pendekatan ini meningkatkan fleksibiliti kod, kesesuaian, dan kebolehgunaan semula, tetapi penjagaan harus diambil untuk mengelakkan pemecahan yang berlebihan dan kerumitan gabungan.

Potensi perangkap dan pertimbangan semasa menggunakan fungsi init di GOPotensi perangkap dan pertimbangan semasa menggunakan fungsi init di GOApr 29, 2025 am 12:02 AM

InitfunctionsingoareautomaticallycalledbeforethemainfunctionAntareusforsetupbutcomewithchallenges.1) ExecutionOrder: MultipleInitFunctionsRunindefinitionorder, whycancauseSifeDeydependoneachother.2)

Bagaimana anda melangkah melalui peta dalam perjalanan?Bagaimana anda melangkah melalui peta dalam perjalanan?Apr 28, 2025 pm 05:15 PM

Artikel membincangkan melewati peta di GO, memberi tumpuan kepada amalan selamat, memodifikasi penyertaan, dan pertimbangan prestasi untuk peta besar. Masalah: Memastikan lelaran peta yang selamat dan cekap di GO, terutamanya dalam persekitaran serentak dan dengan L

Bagaimana anda membuat peta di Go?Bagaimana anda membuat peta di Go?Apr 28, 2025 pm 05:14 PM

Artikel ini membincangkan membuat dan memanipulasi peta di GO, termasuk kaedah permulaan dan menambah/mengemas kini elemen.

Apakah perbezaan antara array dan kepingan di Go?Apakah perbezaan antara array dan kepingan di Go?Apr 28, 2025 pm 05:13 PM

Artikel ini membincangkan perbezaan antara tatasusunan dan kepingan dalam GO, memberi tumpuan kepada saiz, peruntukan memori, lulus fungsi, dan senario penggunaan. Array adalah saiz tetap, diperuntukkan stack, manakala kepingan adalah dinamik, sering ditumpukan, dan lebih fleksibel.

Bagaimana anda membuat kepingan dalam perjalanan?Bagaimana anda membuat kepingan dalam perjalanan?Apr 28, 2025 pm 05:12 PM

Artikel ini membincangkan membuat dan memulakan irisan di GO, termasuk menggunakan literals, fungsi membuat, dan mengiris tatasusunan atau kepingan yang ada. Ia juga meliputi sintaks kepingan dan menentukan panjang dan kapasiti kepingan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).