Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan baris gilir menyekat dalam golang

Bagaimana untuk melaksanakan baris gilir menyekat dalam golang

PHPz
PHPzasal
2023-04-24 14:46:251054semak imbas

Menyekat baris gilir ialah alat yang sangat biasa digunakan semasa membangunkan program konkurensi tinggi. Ia boleh mengawal aliran data dengan berkesan dan memastikan kestabilan dan keselamatan program. Apabila melaksanakan baris gilir menyekat, Golang menyediakan sokongan asas yang sangat mudah Artikel ini akan memperkenalkan cara menggunakan Golang untuk melaksanakan baris gilir sekatan yang cekap dan stabil.

  1. Prinsip baris gilir

Pertama sekali, mari kita fahami prinsip baris gilir. Baris gilir ialah struktur data linear khas dengan ciri masuk dahulu keluar (FIFO). Baris gilir boleh dilaksanakan menggunakan deques atau giliran bulat. Baris menyekat menambah operasi menyekat pada baris gilir Apabila baris gilir kosong, benang bacaan akan disekat sehingga data dimasukkan ke dalam baris gilir. Apabila baris gilir penuh, benang penulisan juga disekat sehingga baris gilir mempunyai ruang yang mencukupi.

  1. Saluran di Golang

Di Golang, saluran adalah teras dalam melaksanakan baris gilir menyekat. Saluran ialah struktur data yang menyediakan mekanisme penyegerakan untuk memindahkan data antara gorouti yang berbeza. Operasi penyekatan pada saluran diuruskan secara automatik, jadi keadaan perlumbaan dan masalah kebuntuan dapat dielakkan. Untuk menyekat baris gilir, saluran Golang ialah struktur data yang sangat ideal.

  1. Kaedah pelaksanaan

Seterusnya, mari kita lihat cara menggunakan saluran Golang untuk melaksanakan baris gilir menyekat. Barisan gilir menyekat kami boleh menyokong operasi berikut:

  • Operasi enqueue
  • Operasi dequeue
  • Operasi saiz giliran

Kami boleh mentakrifkan struktur untuk mewakili baris gilir menyekat:

type BlockQueue struct {
  queue chan interface{}
}

Kemudian, kita boleh mentakrifkan kaedah berikut untuk baris gilir menyekat:

func NewBlockQueue(size int) *BlockQueue {
  bq := &BlockQueue{
    queue: make(chan interface{}, size),
  }
  return bq
}

func (bq *BlockQueue) Push(element interface{}) {
  bq.queue <- element
}

func (bq *BlockQueue) Pop() interface{} {
    return <-bq.queue
}

func (bq *BlockQueue) Size() int {
    return len(bq.queue)
}

Dalam kod di atas, kami menentukan Parameter saiz disediakan untuk memulakan panjang baris gilir, dan kemudian saluran dicipta untuk menyimpan data. Dalam kaedah Tekan, kami menulis data ke baris gilir Jika baris gilir penuh, operasi tulis akan disekat sehingga baris gilir mengosongkan ruang. Dalam kaedah Pop, kita mendapat data daripada baris gilir Jika baris gilir kosong, operasi baca disekat sehingga terdapat data dalam baris gilir. Dalam kaedah Saiz, kami mengembalikan bilangan elemen dalam baris gilir.

  1. Pengendalian pengecualian baris gilir

Tidak dapat tidak, dua pengecualian berikut mungkin berlaku apabila menggunakan baris gilir:

  • Baris gilir telah penuh, tetapi terus menulis data
  • Baris gilir kosong, tetapi masih cuba memaparkan data

Punca ralat adalah kerana kami tidak menganggap saluran itu sendiri mempunyai kawasan penimbal , menyebabkan kita Tiada sekatan berlaku semasa menulis data. Untuk mengelakkan situasi ini, kami boleh mengubah suai kaedah Push kepada kod berikut:

func (bq *BlockQueue) Push(element interface{}) error {
  select {
  case bq.queue <- element:
    return nil
  default:
    return errors.New("队列已满")
  }
}

Pernyataan pilih digunakan dalam kod Jika baris gilir tidak penuh, data akan ditulis secara normal baris gilir penuh , blok kod secara lalai akan dilaksanakan dan mesej ralat bahawa baris gilir penuh akan dikembalikan. Dalam kaedah Pop, kami boleh menggunakan kod berikut untuk mengendalikan pengecualian:

func (bq *BlockQueue) Pop() (interface{}, error) {
  select {
  case element := <-bq.queue:
    return element, nil
  default:
    return nil, errors.New("队列为空")
  }
}

Dalam kod, kami menggunakan penyataan pilih Jika terdapat elemen dalam baris gilir, data akan muncul secara normal baris gilir adalah Jika ia kosong, blok kod secara lalai akan dilaksanakan dan mesej ralat bahawa baris gilir kosong akan dikembalikan.

  1. Ringkasan

Saluran Golang menyediakan cara yang sangat mudah untuk melaksanakan baris gilir menyekat. Apabila melaksanakan baris gilir menyekat, kita perlu memberi perhatian kepada situasi apabila baris gilir penuh dan baris gilir kosong, dan mengendalikan ralat dengan sewajarnya. Barisan beratur boleh memastikan keselamatan dan kestabilan program dan merupakan salah satu alat yang sangat penting dalam program konkurensi tinggi. Kaedah pelaksanaan yang diperkenalkan dalam artikel ini boleh digunakan sebagai templat untuk pembangunan keselarasan tinggi Golang dan mempunyai nilai rujukan yang sangat baik dalam aplikasi praktikal.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan baris gilir menyekat dalam golang. 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