Rumah masalah biasa Cara melaksanakan kawalan konkurensi dalam bahasa go

Cara melaksanakan kawalan konkurensi dalam bahasa go

Jun 08, 2023 pm 02:20 PM
pergi kawalan serentak

Kaedah untuk melaksanakan kawalan konkurensi dalam bahasa go: 1. WaitGroup, pemprosesan tugasan berbilang goroutin mempunyai hubungan pergantungan atau penyambungan; kerja WaitGroup, Memenuhi fungsi Konteks; 3. Konteks, perambatan isyarat antara grout berbilang peringkat, termasuk perambatan metadata, pembatalan perambatan isyarat, kawalan tamat masa, dsb.

Cara melaksanakan kawalan konkurensi dalam bahasa go

Persekitaran pengendalian artikel ini: Sistem Windows 10, versi go1.20, komputer dell g3.

Di Golang, anda boleh membuka goroutine melalui kata kunci go Oleh itu, anda boleh menulis kod serentak dalam Go. Tetapi bagaimana untuk mengawal secara berkesan groutines melaksanakan serentak ini?

Mengenai kawalan serentak, perkara pertama yang mungkin difikirkan oleh ramai orang ialah kunci. Golang juga menyediakan mekanisme berkaitan kunci, termasuk penyegerakan kunci mutex. Mutex dan penyegerakan kunci baca-tulis.RWMutex. Selain kunci, terdapat juga penyegerakan/atom operasi atom, dsb. Walau bagaimanapun, tumpuan mekanisme ini ialah keselamatan data serentak goroutine. Perkara yang ingin dibincangkan oleh artikel ini ialah kawalan tingkah laku serentak goroutine.

Dalam kawalan tingkah laku serentak goroutine, terdapat tiga cara biasa, iaitu WaitGroup, saluran dan Konteks.

WaitGroup

WaitGroup terletak di bawah pakej penyegerakan adalah seperti berikut.

func main() {
  var wg sync.WaitGroup

  wg.Add(2) //添加需要完成的工作量2

  go func() {
    wg.Done() //完成工作量1
    fmt.Println("goroutine 1 完成工作!")
  }()

  go func() {
    wg.Done() //完成工作量1
    fmt.Println("goroutine 2 完成工作!")
  }()

  wg.Wait() //等待工作量2均完成
  fmt.Println("所有的goroutine均已完成工作!")}输出:
//goroutine 2 完成工作!
//goroutine 1 完成工作!
//所有的goroutine均已完成工作!

WaitGroup ialah kaedah kawalan serentak yang amat sesuai untuk situasi di mana tugas tertentu memerlukan berbilang goroutin untuk berfungsi bersama-sama Setiap goroutine hanya boleh melakukan sebahagian daripada tugasan itu hanya apabila semua goroutine selesai selesai. Oleh itu, WaitGroup mempunyai makna yang sama dengan namanya, iaitu cara menunggu.

Walau bagaimanapun, dalam perniagaan sebenar, terdapat senario: apabila keperluan tertentu dipenuhi, goroutine tertentu perlu dimaklumkan secara aktif untuk tamat. Contohnya, jika kita memulakan goroutine pemantauan latar belakang, apabila pemantauan tidak lagi diperlukan, kita harus memberitahu goroutine pemantauan untuk ditamatkan, jika tidak, ia akan terus melahu dan menyebabkan kebocoran.

Saluran

Untuk senario di atas, WaitGroup tidak boleh berbuat apa-apa. Kaedah paling mudah yang boleh difikirkan adalah untuk menentukan pembolehubah global dan memberitahunya dengan mengubahsuai pembolehubah ini di tempat lain agak menyusahkan. Dalam kes ini, saluran+pilihan boleh berguna.

func main() {
  exit := make(chan bool)

  go func() {
    for {
      select {
      case <-exit:
        fmt.Println("退出监控")
        return
      default:
        fmt.Println("监控中")
        time.Sleep(2 * time.Second)
      }
    }
  }()

  time.Sleep(5 * time.Second)
  fmt.Println("通知监控退出")
  exit <- true

  //防止main goroutine过早退出
  time.Sleep(5 * time.Second)}输出:
//监控中
//监控中
//监控中
//通知监控退出
//退出监控

Gabungan saluran+pilihan ini ialah cara yang lebih elegan untuk memberitahu goroutine tentang penghujungnya.

Walau bagaimanapun, penyelesaian ini juga mempunyai had. Cuba bayangkan, bagaimana jika terdapat banyak goroutine yang semuanya perlu dikawal untuk menamatkannya? Bagaimana jika gorouti ini melahirkan gorouti lain? Sudah tentu kita boleh menentukan banyak saluran untuk menyelesaikan masalah ini, tetapi rantaian perhubungan goroutine membawa kepada kerumitan senario ini.

Konteks

Senario di atas adalah perkara biasa di bawah model seni bina CS. Dalam Go, goroutine (A) yang berasingan sering dibuka untuk setiap pelanggan untuk mengendalikan siri permintaannya, dan selalunya satu A juga akan meminta perkhidmatan lain (mulakan goroutine B yang lain), dan B juga boleh meminta goroutine C, C yang lain kemudian menghantar permintaan kepada pelayan Databse, sebagai contoh. Bayangkan apabila pelanggan memutuskan sambungan, A, B dan C yang dikaitkan dengannya perlu keluar serta-merta sebelum sistem boleh menuntut semula sumber yang diduduki oleh A, B dan C. Keluar dari A adalah mudah, tetapi bagaimana untuk memberitahu B dan C untuk juga keluar?

Pada masa ini, Konteks muncul.

func A(ctx context.Context, name string)  {
  go B(ctx ,name) //A调用了B  for {
    select {
    case <-ctx.Done():
      fmt.Println(name, "A退出")
      return
    default:
      fmt.Println(name, "A do something")
      time.Sleep(2 * time.Second)
    }
  }}func B(ctx context.Context, name string)  {
  for {
    select {
    case <-ctx.Done():
      fmt.Println(name, "B退出")
      return
    default:
      fmt.Println(name, "B do something")
      time.Sleep(2 * time.Second)
    }
  }}func main() {
  ctx, cancel := context.WithCancel(context.Background())

  go A(ctx, "【请求1】") //模拟client来了1个连接请求

  time.Sleep(3 * time.Second)
  fmt.Println("client断开连接,通知对应处理client请求的A,B退出")
  cancel() //假设满足某条件client断开了连接,那么就传播取消信号,ctx.Done()中得到取消信号

  time.Sleep(3 * time.Second)}输出:
//【请求1】 A do something
//【请求1】 B do something
//【请求1】 A do something
//【请求1】 B do something
//client断开连接,通知对应处理client请求的A,B退出
//【请求1】 B退出
//【请求1】 A退出

Dalam contoh, permintaan sambungan disimulasikan daripada klien, dan Goroutine A dibuka dengan sewajarnya untuk pemprosesan A juga membolehkan A dan B menggunakan Konteks untuk penjejakan untuk memaklumkan pembatalan , kedua-dua goroutine ini akan ditamatkan.

Ini ialah keupayaan kawalan Konteks Ia seperti pengawal Selepas menekan suis, semua sub-Konteks berdasarkan Konteks ini atau yang diperoleh daripadanya Pada masa ini, operasi pembersihan boleh dilakukan . Akhirnya Lepaskan goroutine, yang menyelesaikan masalah goroutine yang tidak terkawal selepas permulaan.

Penggunaan Konteks yang terperinci adalah di luar skop artikel ini. Akan ada artikel susulan yang menerangkan secara khusus pakej Konteks, jadi nantikan.

Ringkasan

Artikel ini menyenaraikan tiga mod kawalan gelagat serentak di Golang. Tiada perbezaan baik atau buruk antara mod, ia hanya bergantung pada penggunaan penyelesaian yang sesuai untuk senario yang berbeza. Dalam projek sebenar, pelbagai kaedah sering digunakan dalam kombinasi.

  • WaitGroup: Pemprosesan tugasan berbilang goroutine mempunyai kebergantungan atau perhubungan penyambungan.
  • pilihan saluran: Anda boleh membatalkan pemindahan data secara aktif dalam berbilang saluran boleh menggantikan kerja WaitGroup, tetapi ia akan meningkatkan kerumitan logik kod yang boleh memenuhi fungsi Konteks; dan juga membuat kod Logik menjadi rumit.
  • Konteks: Penyebaran isyarat antara grout berbilang peringkat (termasuk perambatan metadata, pembatalan perambatan isyarat, kawalan tamat masa, dsb.).

Di Golang, anda boleh membuka goroutine melalui kata kunci go Oleh itu, anda boleh menulis kod serentak dalam Go. Tetapi bagaimana untuk mengawal secara berkesan groutines melaksanakan serentak ini?

Mengenai kawalan konkurensi, ramai orang mungkin memikirkan kunci terlebih dahulu. Golang juga menyediakan mekanisme berkaitan kunci, termasuk penyegerakan kunci mutex. Mutex dan penyegerakan kunci baca-tulis.RWMutex. Selain kunci, terdapat juga penyegerakan/atom operasi atom, dsb. Walau bagaimanapun, tumpuan mekanisme ini ialah keselamatan data serentak goroutine. Perkara yang ingin dibincangkan oleh artikel ini ialah kawalan tingkah laku serentak goroutine.

Dalam kawalan tingkah laku serentak goroutine, terdapat tiga kaedah biasa, iaitu WaitGroup, saluran dan Konteks.

Atas ialah kandungan terperinci Cara melaksanakan kawalan konkurensi dalam bahasa go. 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

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

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.

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)

Topik panas

Tutorial PHP
1580
276
Cara Memperbaiki 'Peranti ini tidak dikonfigurasi dengan betul. (Kod 1)' Cara Memperbaiki 'Peranti ini tidak dikonfigurasi dengan betul. (Kod 1)' Aug 02, 2025 am 04:33 AM

Pengurus peranti memaparkan tanda seru yang biasanya disebabkan oleh masalah sambungan perkakasan atau keabnormalan pemandu. Penyelesaiannya adalah seperti berikut: 1. Periksa sambungan peranti dan bekalan kuasa, pastikan ia dipasang dan dicabut dan menggunakan hab langsung atau menggantikan antara muka; 2. Kemas kini atau gulung semula pemandu, dan dapatkan pemacu terkini melalui pengurus peranti atau laman web rasmi; 3. Bersihkan maklumat sisa peranti lama, nyahpasang peranti tersembunyi dan mengenal pasti semula; 4. Berhati -hati mengubah suai pendaftaran, padamkan pengecualian selepas sandaran; Jika masih tidak dapat diselesaikan, cuba pasang semula sistem.

Cara Memperbaiki 'Pada masa ini tidak ada pilihan kuasa yang tersedia' Cara Memperbaiki 'Pada masa ini tidak ada pilihan kuasa yang tersedia' Jul 27, 2025 am 01:22 AM

Mula-mula jalankan masalah masalah kuasa, kemudian gunakan arahan arahan pentadbir untuk melaksanakan perintah PowerCFG-RestoredefaultSchemes untuk menetapkan semula skim kuasa, kemudian mengemas kini atau memasang semula pemacu ACPI, periksa tetapan dasar kumpulan (Pro/Enterprise sahaja) Dalam kebanyakan kes, pilihan kuasa akan kembali normal.

Cara membetulkan 'modul yang ditentukan tidak dapat dijumpai' Cara membetulkan 'modul yang ditentukan tidak dapat dijumpai' Jul 25, 2025 am 12:58 AM

Ralat "modul yang tidak dapat ditemui tidak dapat dijumpai" biasanya disebabkan oleh fail DLL yang hilang atau rasuah, tidak memasang pakej Visualc Redistributable, fail sistem rasuah atau kesilapan jalur modul. Anda boleh menyelesaikan masalah dan membetulkannya dengan mengikuti langkah -langkah: 1. Pasang atau membaiki pakej Microsoft Visualc Redistributable; 2. Gunakan alat SFC/Scannow dan DISM untuk membaiki fail sistem; 3. Muat turun dan mendaftar semula fail DLL yang hilang; 4. Kemas kini atau pasang semula pemacu kad grafik untuk memastikan modul grafik biasa; 5. Semak keserasian program dan cuba dijalankan sebagai pentadbir. Dalam kebanyakan kes, mengikut urutan

Cara Memperbaiki Kod Ralat Microsoft Office 30183-27 Cara Memperbaiki Kod Ralat Microsoft Office 30183-27 Jul 28, 2025 am 12:14 AM

Kod ralat 30183-27 biasanya disebabkan oleh kebenaran atau konflik sistem yang tidak mencukupi. 1. Jalankan pemasang sebagai pentadbir dan periksa sama ada fail yang dimuat turun dikunci; 2. Bersihkan folder sementara sistem (%temp%, temp, appData \ local \ temp) dan ruang cakera percuma; 3. Sementara menutup perisian antivirus atau firewall untuk mengelakkan gangguan dengan pemasangan; 4. Gunakan alat pembaikan rasmi Microsoft seperti Microsoft SupportAndRecovery Assistant atau Office Deployment Tool (ODT) untuk menyelesaikan masalah dan memasang; 5. Cuba mulakan semula komputer sebelum memasang. Ikuti langkah -langkah di atas untuk menyelesaikan masalah dalam kebanyakan kes.

Cara Memperbaiki 'Kawasan Data yang Diteruskan ke Panggilan Sistem terlalu kecil' Cara Memperbaiki 'Kawasan Data yang Diteruskan ke Panggilan Sistem terlalu kecil' Jul 25, 2025 am 12:38 AM

Apabila menghadapi ralat "thedataareapassedtoasystemcallistoosmall", 1. Pengguna mesin maya boleh cuba memadam dan menambah semula kad rangkaian maya; 2. Ubah suai pendaftaran dan laraskan parameter LanManWorkStation, cari laluan yang ditentukan dan tetapkan memori ke 1048576, dan tambahkan FileInfocacheentriesMax dan FileObjectCacheentriesMax untuk mengoptimumkan cache; 3. Semak LanmanworkStation, Server dan TCP

Cara Memperbaiki Kod Ralat 0x80070017 Cara Memperbaiki Kod Ralat 0x80070017 Aug 02, 2025 am 04:20 AM

Ralat Kemas Kini Windows 0x80070017 biasanya disebabkan oleh fail sistem, cache atau kesilapan cakera, dan tidak semestinya rasuah cakera keras. Penyelesaiannya adalah seperti berikut: 1. Gunakan alat SFC dan DISM untuk membaiki fail sistem, dan menjalankan arahan SFC/ScanNow dan DISM pada gilirannya; 2. Kosongkan cache kemas kini Windows, dan padamkan kandungan folder softwaredistribusi selepas menghentikan perkhidmatan; 3. Jalankan Chkdsk untuk memeriksa kesilapan cakera, yang boleh dilaksanakan dalam antara muka grafik atau command prompt; 4. Kemas kini atau mengembalikan pemandu, terutamanya pengawal penyimpanan dan pemacu cakera keras. Dalam kebanyakan kes, tiga kaedah pertama dapat diselesaikan. Sekiranya ia masih tidak dapat dikendalikan, ia mungkin masalah perkakasan atau sistem perlu dipasang semula.

Cara Memperbaiki Penjadual Tugas Tidak Menjalankan Tugas Cara Memperbaiki Penjadual Tugas Tidak Menjalankan Tugas Jul 30, 2025 am 01:54 AM

CheckThetrigGerseTtingStoensureTheYareenablyDCorrectlyConfiguredWithTheRightDate, time, andRecurrence; 2.verifyTheActionsEttings, termasukCorrectProgram/ScriptPathSandProperinterPreterusage, terutamanyaForscriptSusingPowersHell.Exewith-ExeceTpolicyB

Apa yang salah dengan panggilan telefon tanpa suara Apa yang salah dengan panggilan telefon tanpa suara Aug 13, 2025 pm 06:09 PM

Sebab -sebab mengapa tidak ada bunyi pada panggilan telefon termasuk: Masalah perkakasan (penceramah yang rosak, lubang earpiece yang disekat, hubungan penyambung yang lemah), masalah perisian (tetapan kelantangan terlalu rendah, mod senyap dihidupkan, kegagalan sistem), masalah rangkaian (kekuatan isyarat lemah, kesesakan rangkaian), dan sebab -sebab lain (alat dengar Bluetooth disambungkan, gangguan permohonan). Penyelesaian termasuk: Memeriksa perkakasan, menyesuaikan tetapan kelantangan, mematikan mod senyap, memulakan semula telefon, mengemas kini sistem, melepaskan alat dengar Bluetooth, dan menyahpasang aplikasi yang bermasalah. Jika masih tidak dapat diselesaikan, sila hubungi Sokongan Teknikal.