Rumah >pembangunan bahagian belakang >Golang >Go Basics Goroutine
Artikel ini akan terus menumpukan pada bahagian asas bahasa Go. Kami akan bercakap sedikit tentang prestasi dan melanjutkan aplikasi kami dengan mencipta beberapa goroutine mudah.
Kami juga akan memberi perhatian kepada beberapa logik pelaksanaan asas bahasa Go dan perbezaan antara bahasa Go dan bahasa lain.
Sebelum meneruskan perbincangan, kita mesti memahami konsep concurrency dan parallelism. Golang boleh mencapai konkurensi dan selari.
Mari kita lihat perbezaan antara concurrency dan parallelism.
Sesuatu aplikasi boleh mengendalikan berbilang proses untuk mencapai kefungsian yang dimaksudkan. Anggapkan laman web e-dagang yang mudah Ia telah dinilai bahawa tugas-tugas berikut perlu dilaksanakan secara serentak:
Paparkan maklumat transaksi dan produk terkini di bahagian atas halaman web
bilangan pengguna dalam talian semasa tapak web ;
Kemas kini butiran troli beli-belah selepas pengguna memilih item; untuk menjalankan semua tugas ini pada masa yang sama untuk memastikan pengguna terlibat dengan tapak web Kekal relevan dan menjadikan tapak web anda menarik kepada pengguna dan menarik lebih banyak perniagaan. Oleh itu, untuk memenuhi keperluan perniagaan, aplikasi atau tapak web yang mudah mungkin mengandungi satu set tugas yang berjalan di latar belakang.
Fahami konkurensi dan pelaksanaan selari
Andaikan terdapat senario di mana kita mempunyai mesin teras tunggal yang perlu menyelesaikan pelbagai tugas, tetapi terdapat had bahawa hanya satu tugasan boleh dijalankan pada mesin teras tunggal pada bila-bila masa.
Dalam model konkurensi, terdapat suis konteks antara tugas. Program ini sedang memproses berbilang tugas, tetapi oleh kerana kami hanya mempunyai satu teras, tugasan tidak boleh dilaksanakan bersama-sama.
Pertukaran konteks antara tugas adalah sangat pantas sehingga kami merasakan tugasan berjalan serentak.
Tiada faktor pelaksanaan selari semasa proses pelaksanaan, kerana ia adalah sistem teras tunggal, dan pelbagai proses tidak boleh dilaksanakan secara selari.
Seperti yang ditunjukkan dalam gambar di atas, Concurrency (Tanpa Paralelisme) mempunyai dua tugasan yang perlu dilaksanakan secara serentak. Pada bila-bila masa, hanya satu tugasan sedang dijalankan dan terdapat pertukaran konteks antara tugasan.
Apabila menggunakan teras tunggal, terdapat had bilangan teras. Jika kita menambah bilangan teras dalam mesin, kita boleh melaksanakan tugas pada teras yang berbeza secara serentak.
Dalam gambar di atas (Paralelisme), terdapat dua tugasan yang dilaksanakan pada bila-bila masa, dan kedua-dua tugasan ini dijalankan pada teras yang berbeza.
Concurrency ialah pemprosesan serentak berbilang tugas dalam tempoh masa tertentu, dan selari ialah keupayaan untuk melaksanakan berbilang tugas pada satu masa tertentu.
Menggunakan bahasa Go, anda boleh menskalakan program anda dengan mudah daripada pelaksanaan serentak kepada pelaksanaan selari.
Untuk menggunakan bahasa Go untuk mencapai keselarasan dan keselarian, kita perlu memahami konsep Goroutines. Coroutine bahasa Go boleh difahami sebagai pembalut pada urutan, diuruskan oleh masa jalan Go dan bukannya sistem pengendalian.
Waktu jalan Go bertanggungjawab untuk memperuntukkan dan mengitar semula sumber kepada coroutines sangat serupa dengan urutan yang menyelesaikan pelbagai tugas tetapi menggunakan sumber yang lebih sedikit daripada urutan sistem pengendalian. Tidak ada hubungan satu dengan satu antara coroutine dan benang.
Kami boleh "menguraikan" aplikasi kepada beberapa tugas serentak, yang boleh diselesaikan oleh goroutine yang berbeza Dengan cara ini, keselarasan bahasa Go boleh dicapai.
Kelebihan coroutine:
Lebih ringan;
Mudah untuk berkembang;
Virtual Threads; contoh mudah:
package main import ( "fmt" "time" ) func main() { start := time.Now() func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() elapsedTime := time.Since(start) fmt.Println("Total Time For Execution: " + elapsedTime.String()) time.Sleep(time.Second) }Kod di atas melaksanakan dua fungsi bebas dalam fungsi utama dalam urutan.
Memperkenalkan coroutine
Dalam kod di atas, kami menggunakan kata kunci go untuk membuka coroutine Fungsi ini akan dilaksanakan dalam coroutine dan bukannya coroutine utama. Ini meningkatkan serentak dan meningkatkan prestasi Program . . telah ditetapkan kepada bilangan teras CPU).
package main import ( "fmt" "time" ) func main() { start := time.Now() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() go func() { for i:=0; i < 3; i++ { fmt.Println(i) } }() elapsedTime := time.Since(start) fmt.Println("Total Time For Execution: " + elapsedTime.String()) time.Sleep(time.Second) }
Ini menyatakan bahawa atur cara berjalan pada mesin berbilang teras Baris kod di atas menyatakan bahawa atur cara boleh menggunakan empat teras untuk dilaksanakan.
Setelah coroutine dicipta, ia boleh dilaksanakan dalam teras yang berbeza, membolehkan paralelisme dan pelaksanaan program yang lebih pantas.runtime.GOMAXPROCS(4)Keluaran kod di atas adalah seperti berikut:
Konkurensi dan keselarian boleh dicapai dengan mudah menggunakan bahasa Go. Hanya tambah kata kunci pergi sebelum fungsi untuk meningkatkan kelajuan pelaksanaan program.
Atas ialah kandungan terperinci Go Basics Goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!