Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melakukan konkurensi dalam bahasa go

Bagaimana untuk melakukan konkurensi dalam bahasa go

青灯夜游
青灯夜游asal
2023-01-18 14:19:011719semak imbas

Bahasa Go menyokong ciri konkurensi melalui masa jalan pengkompil; Goroutine ialah pelaksanaan yang sangat ringan yang boleh melaksanakan beribu-ribu tugas serentak dalam satu proses Ia adalah teras reka bentuk serentak bahasa Go. Anda boleh mencipta goroutine menggunakan kata kunci go, letakkan perisytiharan go sebelum fungsi yang perlu dipanggil, dan panggil serta jalankan fungsi dalam ruang alamat yang sama, supaya fungsi itu akan dilaksanakan sebagai utas serentak bebas.

Bagaimana untuk melakukan konkurensi dalam bahasa go

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

Concurrency bermaksud berbilang tugasan boleh dilaksanakan pada masa yang sama. Pengaturcaraan serentak mempunyai makna yang luas, termasuk pengaturcaraan berbilang benang, pengaturcaraan berbilang proses dan program diedarkan.

Bahasa Go menyokong ciri konkurensi melalui masa jalan pengkompil (masa jalan). Konkurensi dalam bahasa Go dicapai melalui ciri goroutine. Goroutine adalah serupa dengan benang, tetapi berbilang goroutin boleh dibuat untuk berfungsi serentak mengikut keperluan. Goroutine dijadualkan mengikut masa jalan bahasa Go, manakala urutan dijadualkan oleh sistem pengendalian.

Bahasa Go juga menyediakan saluran untuk komunikasi antara berbilang goroutine. Goroutine dan saluran ialah asas pelaksanaan penting untuk model konkurensi CSP (Communicating Sequential Process) yang dipatuhi oleh bahasa Go.

Pengenalan Goroutine

Goroutine ialah pelaksanaan yang sangat ringan yang boleh melaksanakan beribu-ribu tugas serentak dalam satu proses, yang merupakan teras Go reka bentuk keselarasan bahasa.

Lagipun, goroutine sebenarnya adalah utas, tetapi ia lebih kecil daripada sedozen goroutin mungkin tercermin dalam lima atau enam utas di peringkat bawah, dan bahasa Go juga melaksanakan perkongsian memori antara gorouti.

Gunakan kata kunci go untuk mencipta goroutine, letakkan perisytiharan go sebelum fungsi yang perlu dipanggil, dan panggil serta jalankan fungsi ini dalam ruang alamat yang sama, supaya apabila fungsi itu dilaksanakan, ia akan bertindak sebagai utas serentak bebas Jenis utas ini dipanggil goroutine dalam bahasa Go.

Penggunaan goroutine adalah seperti berikut:

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

Oleh kerana goroutine adalah selari dalam persekitaran CPU berbilang teras, jika blok kod dilaksanakan dalam berbilang goroutine, maka kita telah mencapai kod keselarian.

Jika anda perlu mengetahui pelaksanaan program, bagaimana untuk mendapatkan hasil yang selari? Ia perlu digunakan bersama dengan saluran.

saluran

saluran ialah kaedah komunikasi antara gorouti yang disediakan oleh bahasa Go pada peringkat bahasa. Kita boleh menggunakan saluran untuk menghantar mesej antara dua atau lebih goroutine.

Saluran ialah kaedah komunikasi dalam proses, jadi proses menghantar objek melalui saluran adalah konsisten dengan gelagat lulus parameter semasa memanggil fungsi Sebagai contoh, penunjuk juga boleh dihantar. Jika komunikasi silang proses diperlukan, kami mengesyorkan menggunakan pendekatan sistem teragih, seperti menggunakan protokol komunikasi seperti Socket atau HTTP. Bahasa Go juga mempunyai sokongan yang sangat lengkap untuk Internet.

Saluran adalah berkaitan jenis, iaitu, saluran hanya boleh melepasi satu jenis nilai, dan jenis ini perlu dinyatakan semasa mengisytiharkan saluran. Jika anda mengetahui sesuatu tentang paip Unix, ia tidak sukar untuk memahami saluran, yang boleh dianggap sebagai paip selamat jenis.

Apabila mentakrifkan saluran, anda juga perlu menentukan jenis nilai yang dihantar ke saluran Ambil perhatian bahawa anda mesti menggunakan make untuk mencipta saluran tersebut:

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

Kembali ke Windows dan Linux Pada zaman dahulu sebelum kemunculan pengaturcaraan, tidak ada konsep konkurensi semasa membangunkan program, kerana bahasa pengaturcaraan imperatif adalah berdasarkan serialisasi Program ini akan melaksanakan setiap arahan secara berurutan satu konteks pelaksanaan, iaitu, timbunan panggilan.

Concurrency bermaksud program mempunyai berbilang konteks pelaksanaan semasa dijalankan, sepadan dengan berbilang tindanan panggilan. Kami tahu bahawa apabila setiap proses sedang berjalan, ia mempunyai timbunan dan timbunan panggilan sendiri, dan konteks yang lengkap Apabila sistem pengendalian menjadualkan proses, ia akan menyimpan konteks proses yang dijadualkan, Kemudian memulihkan konteks proses kepada sistem.

Dari perspektif keseluruhan sistem pengendalian, pelbagai proses boleh serentak, jadi apakah nilai konkurensi? Mari kita lihat senario berikut terlebih dahulu.

1) Di satu pihak, kami memerlukan antara muka pengguna grafik yang responsif Sebaliknya, program ini juga perlu melakukan sejumlah besar operasi atau operasi intensif IO, dan kami perlu membuat antara muka. tindak balas dan operasi dilaksanakan pada masa yang sama.

2) Apabila pelayan web kami menghadapi sejumlah besar permintaan pengguna, lebih banyak "unit kerja pelayan web" diperlukan untuk bertindak balas kepada pengguna masing-masing.

3) Urus niaga kami berada dalam persekitaran yang diedarkan Unit kerja yang sama memproses data berpecah pada komputer yang berbeza CPU komputer berkembang dari teras tunggal kepada berbilang teras, dan kami Semua program adalah bersiri keupayaan perkakasan komputer tidak digunakan sepenuhnya.

4) Program kami disekat kerana operasi IO, keseluruhan program berada dalam keadaan bertakung, dan tugas lain yang berkaitan dengan IO tidak dapat dilaksanakan.

Seperti yang anda lihat daripada contoh di atas, program bersiri tidak dapat memenuhi keperluan kami dalam banyak senario. Di bawah ini kami telah meringkaskan beberapa kelebihan program serentak untuk menyedarkan semua orang bahawa concurrency adalah penting:

  • Concurrency boleh mewakili model masalah secara lebih objektif; >Concurrency boleh menggunakan sepenuhnya kelebihan teras CPU dan meningkatkan kecekapan pelaksanaan program; .

  • [Cadangan berkaitan:

    Pergi tutorial video
  • ,
  • Pengajaran pengaturcaraan

    ]

Atas ialah kandungan terperinci Bagaimana untuk melakukan konkurensi dalam 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