Aplikasi teknologi penyegerakan berbilang benang Golang dalam pengoptimuman prestasi

WBOY
Lepaskan: 2023-09-27 18:21:07
asal
1284 orang telah melayarinya

Aplikasi teknologi penyegerakan berbilang benang Golang dalam pengoptimuman prestasi

Aplikasi teknologi penyegerakan berbilang benang Golang dalam pengoptimuman prestasi

Dalam sistem komputer moden, pengoptimuman prestasi merupakan topik penting. Apabila bilangan teras pemproses bertambah, kita mesti menggunakan sepenuhnya kelebihan pemproses berbilang teras untuk meningkatkan keselarasan program dan kecekapan pelaksanaan. Sebagai bahasa pengaturcaraan serentak, Golang menyediakan banyak teknologi penyegerakan berbilang benang yang kaya, yang boleh digunakan dengan baik dalam pengoptimuman prestasi.

Artikel ini akan menumpukan pada beberapa teknologi penyegerakan berbilang benang yang biasa digunakan di Golang dan menggunakan contoh kod khusus untuk menggambarkan aplikasinya dalam pengoptimuman prestasi. Tiga teknik penyegerakan yang biasa digunakan akan diperkenalkan di bawah: kunci mutex, pembolehubah keadaan dan operasi atom.

  1. Mutex (Mutex)

Mutex ialah salah satu primitif penyegerakan paling asas Ia memastikan pelaksanaan kod bahagian kritikal yang saling eksklusif dengan mengunci dan membuka kunci operasi sebelum dan selepas kod bahagian kritikal. Pakej penyegerakan disediakan dalam Golang dan jenis Mutex menyediakan pelaksanaan kunci mutex.

Berikut ialah contoh kod menggunakan kunci mutex:

package main

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

var counter int
var mutex sync.Mutex

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

    counter++
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()

            time.Sleep(time.Millisecond * 100)
            increment()
        }()
    }

    wg.Wait()

    fmt.Println("Counter:", counter)
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta mutex kunci mutex dan memanggil kaedah Kunci dan Buka Kunci sebelum dan selepas fungsi kenaikan. Kemudian kami memulakan 10 goroutine dan memanggil fungsi kenaikan dalam setiap goroutine untuk menambah kaunter. Melalui penggunaan kunci mutex, kami memastikan operasi kaunter adalah selamat. Keputusan pembilang keluaran akhir hendaklah 10.

  1. Pembolehubah keadaan (Cond)

Pembolehubah keadaan ialah penyegerakan primitif yang lebih maju daripada kunci mutex, yang membolehkan goroutine menunggu atau meneruskan pelaksanaan apabila syarat tertentu dipenuhi. Pakej penyegerakan dalam Golang menyediakan jenis Cond untuk melaksanakan pembolehubah keadaan.

Berikut ialah kod sampel menggunakan pembolehubah keadaan:

package main

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

var ready bool
var mutex sync.Mutex
var cond = sync.NewCond(&mutex)

func worker() {
    fmt.Println("Worker: Waiting for ready signal...")
    mutex.Lock()
    for !ready {
        cond.Wait()
    }
    mutex.Unlock()

    fmt.Println("Worker: Ready signal received!")
    time.Sleep(time.Second)
    fmt.Println("Worker: Task completed!")
}

func main() {
    wg := sync.WaitGroup{}
    wg.Add(1)

    go func() {
        defer wg.Done()
        worker()
    }()

    time.Sleep(time.Second)
    fmt.Println("Main: Sending ready signal...")
    mutex.Lock()
    ready = true
    cond.Signal()
    mutex.Unlock()

    wg.Wait()
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta kod pembolehubah keadaan dan menghantar mutex kunci mutex. Dalam fungsi pekerja, kita mula-mula memanggil kaedah Kunci untuk mendapatkan kunci mutex, dan kemudian semak secara berterusan sama ada syarat dipenuhi melalui gelung for. Jika syarat tidak dipenuhi, lepaskan kunci mutex melalui kaedah Tunggu dan tunggu ketibaan isyarat pembolehubah keadaan. Apabila syarat dipenuhi, isyarat dihantar melalui kaedah Isyarat dan kaedah Buka Kunci dipanggil untuk melepaskan kunci mutex. Hasil keluaran akhir hendaklah Pekerja mencetak "Pekerja: Tugas selesai!".

  1. Operasi atom (Atomik)

Operasi atom ialah kaedah pelaksanaan penyegerakan tanpa kunci, yang boleh berkongsi dan mengendalikan data antara berbilang goroutin. Pakej atom di Golang menyediakan satu siri fungsi operasi atom, seperti Tambah, Muatkan, Simpan, dsb.

Berikut ialah kod sampel yang menggunakan operasi atom untuk melaksanakan kenaikan diri:

package main

import (
    "fmt"
    "sync/atomic"
    "time"
)

var counter int64

func increment() {
    atomic.AddInt64(&counter, 1)
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()

            time.Sleep(time.Millisecond * 100)
            increment()
        }()
    }

    wg.Wait()

    fmt.Println("Counter:", atomic.LoadInt64(&counter))
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan fungsi AddInt64 dalam pakej atom untuk melaksanakan operasi atom pada kaunter. Melalui operasi atom, kami mengelakkan penggunaan kunci mutex dan meningkatkan kecekapan pelaksanaan serentak.

Ringkasnya, Golang menyediakan pelbagai teknologi penyegerakan berbilang benang, seperti kunci mutex, pembolehubah keadaan dan operasi atom, yang memainkan peranan penting dalam pengoptimuman prestasi. Dengan memilih dan menggunakan teknologi penyegerakan ini dengan betul, kami boleh memanfaatkan sepenuhnya pemproses berbilang teras dan meningkatkan keselarasan program dan kecekapan pelaksanaan. Sudah tentu, dalam pengoptimuman prestasi, kita juga perlu memilih teknologi penyegerakan yang paling sesuai mengikut situasi sebenar, dan menjalankan penalaan dan ujian yang munasabah untuk mencapai kesan pengoptimuman prestasi yang terbaik.

Atas ialah kandungan terperinci Aplikasi teknologi penyegerakan berbilang benang Golang dalam pengoptimuman prestasi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!