Rumah pembangunan bahagian belakang Golang Aplikasi praktikal pakej Golang Sync dalam meningkatkan prestasi program

Aplikasi praktikal pakej Golang Sync dalam meningkatkan prestasi program

Sep 28, 2023 am 08:17 AM
segerak Kunci serentak

Golang Sync包在提高程序性能中的实际应用

Aplikasi praktikal pakej Golang Sync dalam meningkatkan prestasi program

Ikhtisar
Golang ialah bahasa pengaturcaraan sumber terbuka yang mempunyai Kuasa ciri pengaturcaraan. Dalam proses pengaturcaraan serentak, untuk memastikan ketekalan data dan mengelakkan keadaan perlumbaan, primitif penyegerakan perlu digunakan. Golang menyediakan pakej Penyegerakan, yang merangkumi beberapa mekanisme penyegerakan yang biasa digunakan, seperti kunci mutex, kunci baca-tulis, pembolehubah keadaan, dsb. Mekanisme penyegerakan ini boleh membantu kami meningkatkan prestasi dan kecekapan program kami.

Mutex (Mutex)
Mutex ialah mekanisme penyegerakan paling asas dalam pakej Penyegerakan, digunakan untuk melindungi akses kepada sumber kongsi. Dengan menggunakan mutex, kami boleh memastikan bahawa hanya satu utas boleh mengakses sumber yang dikongsi pada satu masa. Berikut ialah kod sampel menggunakan mutex:

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
    wg      sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment()
    }

    wg.Wait()
    fmt.Println("Counter:", counter)
}

func increment() {
    mutex.Lock()
    defer mutex.Unlock()

    counter++

    wg.Done()
}
Salin selepas log masuk

Dalam contoh di atas, kami mula-mula mentakrifkan kunci mutex. Dalam fungsi kenaikan, kita mula-mula memperoleh kunci dengan memanggil mutex.Lock(), kemudian melaksanakan operasi yang perlu dilindungi (di sini, menambah pembilang), dan akhirnya memanggil mutex.Unlock() untuk melepaskan kunci. Ini memastikan bahawa hanya satu goroutine boleh melaksanakan kod ini pada masa yang sama, sekali gus mengelakkan keadaan perlumbaan.

Kunci baca-tulis (RWMutex)
Kunci baca-tulis ialah mekanisme penyegerakan yang lebih maju yang boleh mengunci operasi baca dan operasi tulis secara berasingan. Dalam senario di mana terdapat banyak bacaan dan sedikit tulisan, menggunakan kunci baca-tulis boleh meningkatkan prestasi program dengan ketara. Berikut ialah kod sampel menggunakan kunci baca-tulis:

package main

import (
    "fmt"
    "sync"
)

var (
    resource int
    rwMutex  sync.RWMutex
    wg       sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go read()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go write()
    }

    wg.Wait()
    fmt.Println("Resource:", resource)
}

func read() {
    rwMutex.RLock()
    defer rwMutex.RUnlock()

    fmt.Println("Read:", resource)

    wg.Done()
}

func write() {
    rwMutex.Lock()
    defer rwMutex.Unlock()

    resource++
    fmt.Println("Write:", resource)

    wg.Done()
}
Salin selepas log masuk

Dalam contoh di atas, kami mula-mula mentakrifkan kunci baca-tulis rwMutex. Dalam fungsi baca, kami memperoleh kunci baca dengan memanggil rwMutex.RLock(), dan kemudian melaksanakan operasi baca (di sini ialah nilai semasa sumber output). Dalam fungsi tulis, kami memperoleh kunci tulis dengan memanggil rwMutex.Lock(), dan kemudian melaksanakan operasi tulis (di sini, sumber itu dinaikkan secara automatik). Dengan menggunakan kunci baca-tulis, kita boleh mencapai berbilang sumber bacaan goroutine pada masa yang sama, tetapi hanya satu goroutine boleh melakukan operasi tulis.

Pembolehubah keadaan (Cond)
Pembolehubah keadaan ialah satu lagi mekanisme penyegerakan penting dalam pakej Penyegerakan, yang boleh membantu kami menghantar isyarat antara berbilang goroutine. Dengan menggunakan pembolehubah keadaan, kami boleh melaksanakan beberapa operasi penyegerakan yang kompleks, seperti menunggu syarat tertentu untuk dipenuhi sebelum meneruskan ke langkah seterusnya. Berikut ialah kod sampel menggunakan pembolehubah keadaan:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    ready  bool
    mutex  sync.Mutex
    cond   *sync.Cond
    wg     sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    mutex.Lock()
    
    cond = sync.NewCond(&mutex)
    
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go waitForSignal()
    }

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    wg.Wait()
}

func waitForSignal() {
    cond.L.Lock()
    defer cond.L.Unlock()

    fmt.Println("WAITING FOR SIGNAL")
    cond.Wait()
    fmt.Println("GOT SIGNAL")

    wg.Done()
}
Salin selepas log masuk

Dalam contoh di atas, kita mula-mula mencipta pembolehubah keadaan menggunakan fungsi sync.NewCond() dan mengaitkannya dengan mutex lock mutex stand up. Dalam fungsi waitForSignal, kita mula-mula mendapatkan kunci pembolehubah keadaan dengan memanggil cond.L.Lock(), kemudian panggil cond.Wait() untuk menunggu ketibaan isyarat, dan akhirnya panggil cond.L.Unlock() untuk melepaskan kunci. Dalam fungsi utama, kami menghantar isyarat dengan memanggil cond.Signal() untuk memberitahu semua goroutine yang menunggu. Dengan menggunakan pembolehubah keadaan, kami boleh mencapai kerjasama antara berbilang goroutine untuk mencapai operasi penyegerakan yang lebih kompleks.

Ringkasan
Pakej Penyegerakan Golang menyediakan beberapa mekanisme penyegerakan biasa, seperti kunci mutex, kunci baca-tulis dan pembolehubah keadaan, yang boleh membantu kami meningkatkan prestasi dan kecekapan program. Kunci Mutex digunakan untuk melindungi akses kepada sumber yang dikongsi, kunci Baca-tulis boleh meningkatkan prestasi dalam senario yang terdapat lebih banyak bacaan dan kurang pembolehubah keadaan boleh merealisasikan penghantaran isyarat antara berbilang goroutine. Dalam aplikasi praktikal, kita boleh memilih mekanisme penyegerakan yang sesuai mengikut keperluan khusus dan melaksanakannya bersama dengan kod tertentu, dengan itu meningkatkan kualiti dan prestasi program.

Atas ialah kandungan terperinci Aplikasi praktikal pakej Golang Sync dalam meningkatkan prestasi program. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

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

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Bagaimanakah concurrency dan multithreading fungsi Java boleh meningkatkan prestasi? Apr 26, 2024 pm 04:15 PM

Teknik concurrency dan multithreading menggunakan fungsi Java boleh meningkatkan prestasi aplikasi, termasuk langkah berikut: Memahami konsep concurrency dan multithreading. Manfaatkan pustaka konkurensi dan berbilang benang Java seperti ExecutorService dan Callable. Amalkan kes seperti pendaraban matriks berbilang benang untuk memendekkan masa pelaksanaan. Nikmati kelebihan peningkatan kelajuan tindak balas aplikasi dan kecekapan pemprosesan yang dioptimumkan yang dibawa oleh concurrency dan multi-threading.

Aplikasi konkurensi dan coroutine dalam reka bentuk API Golang Aplikasi konkurensi dan coroutine dalam reka bentuk API Golang May 07, 2024 pm 06:51 PM

Concurrency dan coroutine digunakan dalam reka bentuk GoAPI untuk: Pemprosesan berprestasi tinggi: Memproses berbilang permintaan serentak untuk meningkatkan prestasi. Pemprosesan tak segerak: Gunakan coroutine untuk memproses tugas (seperti menghantar e-mel) secara tidak segerak, melepaskan utas utama. Pemprosesan strim: Gunakan coroutine untuk memproses strim data dengan cekap (seperti bacaan pangkalan data).

Apakah perbezaan antara iPhone yang dikunci dan tidak dikunci Pengenalan terperinci: Perbandingan perbezaan antara iPhone yang dikunci dan tidak dikunci Apakah perbezaan antara iPhone yang dikunci dan tidak dikunci Pengenalan terperinci: Perbandingan perbezaan antara iPhone yang dikunci dan tidak dikunci Mar 28, 2024 pm 03:10 PM

Telefon mudah alih Apple ialah telefon mudah alih yang paling banyak dipilih oleh orang baru-baru ini, tetapi kita sering melihat orang membincangkan perbezaan antara telefon bimbit Apple yang dikunci dan tidak dikunci dalam talian, dan mereka terjerat dalam mana satu untuk dibeli. Hari ini, Chen Siqi akan berkongsi dengan anda perbezaan antara iPhone terkunci dan tidak berkunci serta membantu anda menyelesaikan masalah. Malah, tidak banyak perbezaan antara kedua-duanya dari segi penampilan dan fungsi. Apakah versi terkunci dan versi tidak berkunci? iPhone tanpa sekatan mengunci bermakna ia tidak dihadkan oleh pengendali, dan kad SIM mana-mana pengendali boleh digunakan secara normal. Versi terkunci bermakna ia mempunyai kunci rangkaian dan hanya boleh menggunakan kad SIM yang disediakan oleh pengendali yang ditetapkan dan tidak boleh menggunakan orang lain. Malah, telefon Apple yang tidak berkunci boleh menggunakan mudah alih,

Bagaimanakah sambungan pangkalan data Java mengendalikan transaksi dan konkurensi? Bagaimanakah sambungan pangkalan data Java mengendalikan transaksi dan konkurensi? Apr 16, 2024 am 11:42 AM

Transaksi memastikan integriti data pangkalan data, termasuk atomicity, konsistensi, pengasingan dan ketahanan. JDBC menggunakan antara muka Sambungan untuk menyediakan kawalan transaksi (setAutoCommit, commit, rollback). Mekanisme kawalan konkurensi menyelaraskan operasi serentak, menggunakan kunci atau kawalan konkurensi optimis/pesimis untuk mencapai pengasingan transaksi untuk mengelakkan ketidakkonsistenan data.

Bagaimanakah fungsi kunci dalam golang dilaksanakan? Bagaimanakah fungsi kunci dalam golang dilaksanakan? Jun 05, 2024 pm 12:39 PM

Kunci dalam bahasa Go melaksanakan kod serentak yang disegerakkan untuk mengelakkan persaingan data: Mutex: Mutex lock, yang memastikan bahawa hanya satu goroutine memperoleh kunci pada masa yang sama dan digunakan untuk kawalan bahagian kritikal. RWMutex: Kunci baca-tulis, yang membolehkan berbilang goroutin membaca data pada masa yang sama, tetapi hanya satu goroutine boleh menulis data pada masa yang sama Ia sesuai untuk senario yang memerlukan pembacaan dan penulisan data yang kerap.

Panduan untuk menguji unit fungsi serentak Go Panduan untuk menguji unit fungsi serentak Go May 03, 2024 am 10:54 AM

Unit menguji fungsi serentak adalah penting kerana ini membantu memastikan kelakuan mereka yang betul dalam persekitaran serentak. Prinsip asas seperti pengecualian bersama, penyegerakan dan pengasingan mesti dipertimbangkan semasa menguji fungsi serentak. Fungsi serentak boleh diuji unit dengan mensimulasikan, menguji keadaan perlumbaan dan mengesahkan keputusan.

Bagaimana untuk menggunakan kelas atom dalam fungsi Java concurrency dan multi-threading? Bagaimana untuk menggunakan kelas atom dalam fungsi Java concurrency dan multi-threading? Apr 28, 2024 pm 04:12 PM

Kelas atom ialah kelas selamat benang di Java yang menyediakan operasi tanpa gangguan dan penting untuk memastikan integriti data dalam persekitaran serentak. Java menyediakan kelas atom berikut: AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Kelas ini menyediakan kaedah untuk mendapatkan, menetapkan dan membandingkan nilai untuk memastikan bahawa operasi adalah atom dan tidak akan diganggu oleh benang. Kelas atom berguna apabila bekerja dengan data kongsi dan mencegah rasuah data, seperti mengekalkan akses serentak ke kaunter kongsi.

Penjadualan proses Golang: Mengoptimumkan kecekapan pelaksanaan serentak Penjadualan proses Golang: Mengoptimumkan kecekapan pelaksanaan serentak Apr 03, 2024 pm 03:03 PM

Penjadualan proses Go menggunakan kaedah pengoptimuman koperasi termasuk: menggunakan coroutine ringan sebanyak mungkin untuk memperuntukkan coroutine secara munasabah untuk mengelakkan operasi menyekat dan menggunakan kunci dan primitif penyegerakan.

See all articles