Go Basics Goroutine

Golang菜鸟
Golang菜鸟ke hadapan
2023-08-08 16:30:10832semak imbas



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.

Concurrency dalam bahasa Go

Sebelum meneruskan perbincangan, kita mesti memahami konsep concurrency dan parallelism. Golang boleh mencapai konkurensi dan selari.

Mari kita lihat perbezaan antara concurrency dan parallelism.

Fahami konkurensi

Go Basics Goroutine

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:

  1. Paparkan maklumat transaksi dan produk terkini di bahagian atas halaman web

  2. bilangan pengguna dalam talian semasa tapak web ;

  3. 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.

  4. Dalam dua contoh yang ditunjukkan di atas, berbilang tugasan dilaksanakan secara serentak, tetapi masih terdapat perbezaan di antara mereka. Mari belajar lebih jauh untuk lebih memahami.
  5. Fahami konkurensi dan pelaksanaan selari

Mengendalikan aplikasi serentak

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.

Aplikasi menyertai selari

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.

Menggunakan Goroutines

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.

Go Basics Goroutine

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:

  1. Lebih ringan;

  2. Mudah untuk berkembang;

  3. 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.
  4. Kod tidak menggunakan coroutine dan program dilaksanakan dalam urutan yang sama. Program ini tidak mempunyai sebarang konkurensi, dan keputusan pelaksanaan adalah seperti berikut:

  5. Kod dilaksanakan mengikut tertib, bermula dari fungsi utama, mula-mula melaksanakan fungsi pertama, kemudian melaksanakan fungsi kedua, dan akhirnya keluar seperti biasa daripada fungsi utama.
  6. Memperkenalkan coroutine

  7. Contoh senario di atas tidak menggunakan sebarang coroutine. Kita boleh menggunakan kata kunci go untuk memulakan coroutine sebelum melaksanakan fungsi. . Dua coroutine dibuka dan fungsi masing-masing dilaksanakan, termasuk coroutine utama Terdapat sejumlah 3 coroutine.

Fahami perbezaan daripada pelaksanaan berurutan

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. Go Basics Goroutine

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!

Kenyataan:
Artikel ini dikembalikan pada:Golang菜鸟. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:27 sebab mengapa Goroutine hangArtikel seterusnya:27 sebab mengapa Goroutine hang