Numero di elementi in un canale


88

Usando un canale bufferizzato, come misurare quanti elementi ci sono nel canale? Ad esempio, sto creando e inviando su un canale come questo:

send_ch := make(chan []byte, 100)
// code
send_ch <- msg

Voglio misurare quanti msg sono nel canale send_ch .

Sono consapevole che a causa della concorrenza la misurazione non sarà esatta, poiché potrebbe verificarsi una prelazione tra la misurazione e l'azione (ad esempio discusso in questo video Google I / O 2012 - Go Concurrency Patterns ). Lo userò per il controllo del flusso tra produttori e consumatori, ovvero una volta passato attraverso un limite massimo, modificando alcuni comportamenti fino a quando non passo nuovamente attraverso un limite minimo.

Risposte:


155

http://golang.org/pkg/builtin/#len

func len (v Type) int
La funzione incorporata len restituisce la lunghezza di v, in base al suo tipo:

  • Array: il numero di elementi in v.
  • Pointer to array: il numero di elementi in * v (anche se v è nullo).
  • Slice, o mappa: il numero di elementi in v; se v è zero, len (v) è zero.
  • Stringa: il numero di byte in v.
  • Canale: il numero di elementi accodati (non letti) nel buffer del canale; se v è zero, len (v) è zero.
package main

import "fmt"

func main() {
        c := make(chan int, 100)
        for i := 0; i < 34; i++ {
                c <- 0
        }
        fmt.Println(len(c))
}

produrrà:

34

4
Grazie Artem. Questo è un uso inaspettato di len: mi sarei aspettato che restituisse la capacità di un canale, non il numero di elementi in esso! Buono a sapersi, grazie ancora.
Sonia Hamilton

40
Se avessi voluto la capacità, allora la funzione incorporata caplo farebbe.
ANisus

6
Quello che trovo interessante qui è che se il canale è creato senza capacità ( c := make(chan int)) non puoi ottenere la sua lunghezza. Non ho trovato una ragione per questo. Sì, anche la capacità torna a 0
Brettski

Mi sento strano che quando è senza buffer, non riesco a ottenere la sua lunghezza. E quando si usano le goroutine, è un po 'un pasticcio.
Berkant Ipek

7
@Brettski e Berkant, se il canale è senza buffer (capacità = 0), la lunghezza sarà sempre zero. Il mittente si blocca finché il destinatario non ha ricevuto il valore. golang.org/doc/effective_go.html#channels
Farshid T
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.