Как я узнаю, что горутин сделан, без блокировки? - PullRequest
8 голосов
/ 13 ноября 2009

Все примеры, которые я видел до сих пор, включают блокировку для получения результата (через оператор <-chan).

Мой текущий подход предусматривает передачу указателя на структуру:

type goresult struct {
    result resultType;
    finished bool;
}

, который записывает горутин по завершении. Тогда просто проверить finished, когда это удобно. У вас есть лучшие альтернативы?

То, к чему я действительно стремлюсь, это система слотов сигналов в стиле Qt. У меня есть предчувствие, что решение будет выглядеть почти тривиально (у chan s есть много неизведанного потенциала), но я еще недостаточно знаком с языком, чтобы понять это.

Ответы [ 3 ]

13 голосов
/ 13 ноября 2009

Вы можете использовать шаблон «запятая, ок» (см. Их страницу на « эффектный ход »):

foo     := <- ch; // This blocks.
foo, ok := <- ch; // This returns immediately.
5 голосов
/ 13 ноября 2009

Выбор операторов позволяет проверять несколько каналов одновременно, выбирая случайную ветвь (из тех, где связь ожидает):

func main () {
    for {
    select {
        case w := <- workchan:
            go do_work(w)
        case <- signalchan:
            return
        // default works here if no communication is available
        default:
            // do idle work
    }
    }
}

Для всех отправлять и получать выражения в выражении "выбрать", выражения канала оцениваются, наряду с любыми выражениями, которые появляются на правой стороне отправки выражения в порядке сверху вниз. Если какая-либо из полученных операций может продолжить, один выбран и соответствующее сообщение и Заявления оцениваются. Иначе, если есть случай по умолчанию, то выполняет; если нет, оператор блокирует пока одно из сообщений не может полный.

4 голосов
/ 14 ноября 2009

Вы также можете посмотреть на буфер канала, чтобы увидеть, содержит ли он что-нибудь, используя len:

if len(channel) > 0 {
  // has data to receive
}

Это не коснется буфера канала, в отличие от foo, gotValue := <- ch, который удаляет значение, когда gotValue == true.

...