cari
Rumahpembangunan bahagian belakangGolangMaster Go&#s Concurrency: Rahsia Penyebaran dan Pembatalan Konteks Terbongkar

Master Go

Model konkurensi Go adalah pengubah permainan, tetapi mengurus operasi serentak yang kompleks boleh menjadi rumit. Di situlah penyebaran dan pembatalan konteks berlaku. Alat berkuasa ini membolehkan kami membina operasi yang teguh dan boleh dibatalkan yang menjangkau berbilang goroutin dan juga sempadan rangkaian.

Mari kita mulakan dengan perkara asas. Pakej konteks menyediakan cara untuk membawa tarikh akhir, isyarat pembatalan dan nilai berskop permintaan merentasi sempadan API dan antara proses. Ia adalah sos rahsia untuk mengawal operasi yang berjalan lama dan mematikan perkhidmatan dengan anggun.

Berikut ialah contoh mudah menggunakan konteks untuk pembatalan:

func longRunningOperation(ctx context.Context) error {
    for {
        select {
        case 



<p>Dalam contoh ini, kami mencipta konteks dengan tamat masa 5 saat. Jika operasi tidak selesai dalam masa itu, operasi itu dibatalkan secara automatik.</p>

<p>Tetapi konteks bukan hanya untuk tamat masa. Kami boleh menggunakannya untuk menyebarkan isyarat pembatalan merentasi berbilang goroutin. Ini amat berguna untuk mengurus aliran kerja yang kompleks.</p>

<p>Pertimbangkan senario di mana kami sedang membina sistem transaksi teragih. Kami mungkin mempunyai berbilang perkhidmatan mikro yang terlibat dalam satu urus niaga, dan kami perlu memastikan bahawa jika mana-mana bahagian gagal, keseluruhan urus niaga akan ditarik balik.</p>

<p>Begini cara kami boleh menyusun ini menggunakan konteks:<br>
</p>

<pre class="brush:php;toolbar:false">func performTransaction(ctx context.Context) error {
    // Start the transaction
    tx, err := db.BeginTx(ctx, nil)
    if err != nil {
        return err
    }
    defer tx.Rollback() // Will be no-op if tx.Commit() is called

    // Perform multiple operations
    if err := operation1(ctx); err != nil {
        return err
    }
    if err := operation2(ctx); err != nil {
        return err
    }
    if err := operation3(ctx); err != nil {
        return err
    }

    // If we've made it this far, commit the transaction
    return tx.Commit()
}

func operation1(ctx context.Context) error {
    // Make an HTTP request to another service
    req, err := http.NewRequestWithContext(ctx, "GET", "http://service1.example.com", nil)
    if err != nil {
        return err
    }
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    // Process the response...
    return nil
}

Dalam contoh ini, kami menggunakan konteks untuk menyebarkan pembatalan merentas kedua-dua operasi pangkalan data dan permintaan HTTP. Jika konteks dibatalkan pada bila-bila masa (disebabkan tamat masa atau pembatalan eksplisit), semua operasi akan ditamatkan dan sumber akan dibersihkan.

Tetapi bagaimana jika kita memerlukan kawalan yang lebih terperinci ke atas pembatalan? Di situlah jenis konteks tersuai masuk. Kami boleh mencipta jenis konteks kami sendiri yang membawa isyarat pembatalan khusus domain.

Berikut ialah contoh konteks tersuai yang membawa nilai "keutamaan":

type priorityKey struct{}

func WithPriority(ctx context.Context, priority int) context.Context {
    return context.WithValue(ctx, priorityKey{}, priority)
}

func GetPriority(ctx context.Context) (int, bool) {
    priority, ok := ctx.Value(priorityKey{}).(int)
    return priority, ok
}

func priorityAwareOperation(ctx context.Context) error {
    priority, ok := GetPriority(ctx)
    if !ok {
        priority = 0 // Default priority
    }

    // Use the priority to make decisions...
    switch priority {
    case 1:
        // High priority operation
    case 2:
        // Medium priority operation
    default:
        // Low priority operation
    }

    return nil
}

Konteks tersuai ini membolehkan kami menyebarkan maklumat keutamaan bersama-sama dengan isyarat pembatalan, memberikan kami lebih kawalan ke atas operasi serentak kami.

Sekarang, mari bercakap tentang penutupan yang anggun. Apabila kami membina perkhidmatan yang berjalan lama, adalah penting untuk mengendalikan isyarat penutupan dengan betul untuk memastikan kami tidak membiarkan sebarang operasi tergantung atau sumber tidak dibersihkan.

Begini cara kami boleh melaksanakan penutupan anggun menggunakan konteks:

func main() {
    // Create a context that's cancelled when we receive an interrupt signal
    ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
    defer cancel()

    // Start our main service loop
    errChan := make(chan error, 1)
    go func() {
        errChan 



<p>Persediaan ini memastikan bahawa perkhidmatan kami boleh ditutup dengan anggun apabila ia menerima isyarat gangguan, memberikan masa untuk membersihkan sumber dan menyelesaikan sebarang operasi yang sedang berjalan.</p>

<p>Salah satu aspek yang paling berkuasa dalam sistem konteks Go ialah keupayaannya untuk menyebarkan pembatalan merentasi sempadan rangkaian. Ini amat berguna apabila membina sistem teragih di mana operasi mungkin merangkumi pelbagai perkhidmatan.</p><p>Mari kita lihat contoh cara kita boleh melaksanakan ini dalam seni bina perkhidmatan mikro:<br>
</p>

<pre class="brush:php;toolbar:false">func longRunningOperation(ctx context.Context) error {
    for {
        select {
        case 



<p>Dalam contoh ini, kami sedang mencipta konteks dengan tamat masa berdasarkan parameter pertanyaan. Konteks ini kemudiannya disebarkan melalui semua panggilan API berikutnya. Jika tamat masa dicapai, semua operasi yang sedang berjalan akan dibatalkan dan kami mengembalikan ralat kepada pelanggan.</p>

<p>Corak ini memastikan bahawa kami tidak mempunyai sebarang operasi "melarikan diri" yang berterusan lama selepas pelanggan berputus asa menunggu jawapan. Ia merupakan bahagian penting dalam membina sistem pengedaran yang responsif dan cekap sumber.</p>

<p>Ralat pengendalian dalam sistem serentak boleh menjadi rumit, tetapi konteks boleh membantu di sini juga. Dengan menggunakan konteks, kami boleh memastikan ralat disebarkan dengan betul dan sumber dibersihkan walaupun ralat berlaku.</p>

<p>Berikut ialah contoh cara kami boleh mengendalikan ralat dalam operasi serentak:<br>
</p>

<pre class="brush:php;toolbar:false">func performTransaction(ctx context.Context) error {
    // Start the transaction
    tx, err := db.BeginTx(ctx, nil)
    if err != nil {
        return err
    }
    defer tx.Rollback() // Will be no-op if tx.Commit() is called

    // Perform multiple operations
    if err := operation1(ctx); err != nil {
        return err
    }
    if err := operation2(ctx); err != nil {
        return err
    }
    if err := operation3(ctx); err != nil {
        return err
    }

    // If we've made it this far, commit the transaction
    return tx.Commit()
}

func operation1(ctx context.Context) error {
    // Make an HTTP request to another service
    req, err := http.NewRequestWithContext(ctx, "GET", "http://service1.example.com", nil)
    if err != nil {
        return err
    }
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    // Process the response...
    return nil
}

Dalam contoh ini, kami menggunakan saluran untuk menyampaikan ralat daripada goroutine kembali ke fungsi utama. Kami juga sedang menyemak konteks untuk pembatalan. Ini memastikan bahawa kami mengendalikan kedua-dua ralat daripada operasi itu sendiri dan pembatalan daripada konteks.

Satu aspek konteks yang sering diabaikan ialah keupayaannya untuk membawa nilai berskop permintaan. Ini boleh menjadi sangat berguna untuk menyebarkan perkara seperti ID permintaan, token pengesahan atau metadata lain merentasi sempadan API.

Berikut ialah contoh cara kami boleh menggunakan ini:

type priorityKey struct{}

func WithPriority(ctx context.Context, priority int) context.Context {
    return context.WithValue(ctx, priorityKey{}, priority)
}

func GetPriority(ctx context.Context) (int, bool) {
    priority, ok := ctx.Value(priorityKey{}).(int)
    return priority, ok
}

func priorityAwareOperation(ctx context.Context) error {
    priority, ok := GetPriority(ctx)
    if !ok {
        priority = 0 // Default priority
    }

    // Use the priority to make decisions...
    switch priority {
    case 1:
        // High priority operation
    case 2:
        // Medium priority operation
    default:
        // Low priority operation
    }

    return nil
}

Dalam contoh ini, kami menggunakan perisian tengah untuk menambahkan ID permintaan pada konteks. ID permintaan ini kemudiannya boleh diambil dan digunakan dalam mana-mana pengendali atau fungsi berikutnya yang menerima konteks ini.

Semasa kita mengakhiri, perlu diperhatikan bahawa walaupun konteks ialah alat yang berkuasa, ia bukan peluru perak. Penggunaan konteks yang berlebihan boleh membawa kepada kod yang sukar difahami dan dikekalkan. Adalah penting untuk menggunakan konteks dengan bijak dan mereka bentuk API anda dengan teliti.

Ingat, penggunaan utama konteks hendaklah untuk membawa tarikh akhir, isyarat pembatalan dan nilai berskop permintaan merentasi sempadan API. Ia tidak dimaksudkan untuk menjadi mekanisme tujuan umum untuk menghantar parameter pilihan kepada fungsi.

Kesimpulannya, menguasai model konkurensi Go, termasuk penyebaran dan pembatalan konteks, adalah kunci untuk membina aplikasi yang teguh, cekap dan berskala. Dengan memanfaatkan alatan ini, kami boleh mencipta sistem yang mengendalikan aliran kerja yang kompleks dengan anggun, mengurus sumber dengan berkesan dan bertindak balas secara bijak kepada keadaan yang berubah-ubah. Semasa kami terus menolak sempadan perkara yang mungkin dengan pengaturcaraan serentak, teknik ini akan menjadi lebih penting dalam kotak alat kami.


Ciptaan Kami

Pastikan anda melihat ciptaan kami:

Pusat Pelabur | Hidup Pintar | Epos & Gema | Misteri Membingungkan | Hindutva | Pembangunan Elit | Sekolah JS


Kami berada di Medium

Tech Koala Insights | Dunia Epok & Gema | Medium Pusat Pelabur | Medium Misteri Membingungkan | Sains & Zaman Sederhana | Hindutva Moden

Atas ialah kandungan terperinci Master Go&#s Concurrency: Rahsia Penyebaran dan Pembatalan Konteks Terbongkar. 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
Golang vs Python: Konvensyen dan MultithreadingGolang vs Python: Konvensyen dan MultithreadingApr 17, 2025 am 12:20 AM

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Golang dan C: Perdagangan dalam prestasiGolang dan C: Perdagangan dalam prestasiApr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang vs Python: Aplikasi dan Kes GunakanGolang vs Python: Aplikasi dan Kes GunakanApr 17, 2025 am 12:17 AM

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang vs Python: Perbezaan dan Persamaan UtamaGolang vs Python: Perbezaan dan Persamaan UtamaApr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

Golang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranGolang vs Python: Kemudahan Penggunaan dan Keluk PembelajaranApr 17, 2025 am 12:12 AM

Dalam apa aspek Golang dan Python lebih mudah digunakan dan mempunyai lengkung pembelajaran yang lebih lancar? Golang lebih sesuai untuk kesesuaian tinggi dan keperluan prestasi tinggi, dan lengkung pembelajaran agak lembut untuk pemaju dengan latar belakang bahasa C. Python lebih sesuai untuk sains data dan prototaip cepat, dan lengkung pembelajaran sangat lancar untuk pemula.

Perlumbaan Prestasi: Golang vs CPerlumbaan Prestasi: Golang vs CApr 16, 2025 am 12:07 AM

Golang dan C masing-masing mempunyai kelebihan sendiri dalam pertandingan prestasi: 1) Golang sesuai untuk kesesuaian tinggi dan perkembangan pesat, dan 2) C menyediakan prestasi yang lebih tinggi dan kawalan halus. Pemilihan harus berdasarkan keperluan projek dan tumpukan teknologi pasukan.

Golang vs C: Contoh kod dan analisis prestasiGolang vs C: Contoh kod dan analisis prestasiApr 15, 2025 am 12:03 AM

Golang sesuai untuk pembangunan pesat dan pengaturcaraan serentak, manakala C lebih sesuai untuk projek yang memerlukan prestasi yang melampau dan kawalan asas. 1) Model Concurrency Golang memudahkan pengaturcaraan konvensyen melalui goroutine dan saluran. 2) Pengaturcaraan templat C menyediakan kod generik dan pengoptimuman prestasi. 3) Koleksi sampah Golang adalah mudah tetapi boleh menjejaskan prestasi. Pengurusan memori C adalah rumit tetapi kawalannya baik -baik saja.

Impak Golang: Kelajuan, Kecekapan, dan KesederhanaanImpak Golang: Kelajuan, Kecekapan, dan KesederhanaanApr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivielythroughspeed, efficiency, andsimplicity.1) Speed: goCompilesquicklyandrunsefficiently, idealforlargeproject.2) Kecekapan: ITSComprehensivestandardlibraryraryrarexternaldependencies, enhingdevelyficiency.

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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).