2013-06-10 2 views
4

Я определил узкое место в моей программе, это буферный канал. Я хотел бы дать клиенту указание на загрузку системы, что должно указываться количеством сообщений, буферизованных в канале.Есть ли способ рассказать, сколько сообщений в буфере канала?

Есть ли способ в Перейти, чтобы указать, сколько буферизованных сообщений есть в канале?

Если у вас также есть фон Java, я искал equivelent этого: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html#size()

ответ

11

Length and capacity

Встроенные функции len и cap принимают аргументы различных типов и возвращающих результат типа int. Реализация гарантирует, что результат всегда соответствует int.

Call  Argument type Result 

len(s) chan T   number of elements queued in channel buffer 

cap(s) chan T   channel buffer capacity 

len функция для канала дает количество элементов в очереди в буфере канала. Например,

package main 

import "fmt" 

func main() { 
    ch := make(chan int, 8) 
    ch <- 42 
    ch <- 7 
    <-ch 
    ch <- 64 
    // number of queued elements = 1 + 1 - 1 + 1 = 2 
    fmt.Println(len(ch), cap(ch)) 
} 

Выход:

2 8 
-1

Существует альтернативное решение этой проблемы с использованием процесса «очереди», который обрабатывает очередь сообщений, а также в состоянии сообщить о его размере. Для этого вам понадобится входной канал и выходной канал, а также канал запроса, через который будет получен размер. Поскольку будет два входных канала, вам понадобится выбор (выбор CSP) между ними.

Это little demo этого в эксплуатации. Очередь состоит из среза как буфера и входного канала.

func queue(in <-chan string, out chan<- string, query <-chan chan int) { 
    buffer := []string{} 
    var s string 
    var reply chan int 
    for { 
     // Go select doesn't support boolean guards so we need the 'if' outside the select instead 
     if len(buffer) > 0 { 
      select { 
      case reply = <-query: 
       reply <- len(buffer) 
      case s = <-in: 
       buffer = append(buffer, s) 
      case out <- buffer[0]: 
       buffer = buffer[1:] 
      } 
     } else { 
      select { 
      case reply = <-query: 
       reply <- len(buffer) 
      case s = <-in: 
       buffer = append(buffer, s) 
      } 
     } 
    } 
} 
Смежные вопросы