Неблокирующие операции с каналами

GolangGolangBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот лабораторный проект旨在测试您对Golang中非阻塞通道操作的理解。您需要使用带有default子句的select语句来实现非阻塞发送、接收和多路选择。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/ConcurrencyGroup(["Concurrency"]) go/ConcurrencyGroup -.-> go/channels("Channels") subgraph Lab Skills go/channels -.-> lab-15491{{"Неблокирующие операции с каналами"}} end

Неблокирующие операции с каналами

Задача, которую необходимо решить в этом лабораторном проекте, - это реализация неблокирующих операций с каналами с использованием оператора select с предложением default.

  • Реализовать неблокирующее получение из канала с использованием оператора select с предложением default.
  • Реализовать неблокирующую отправку в канал с использованием оператора select с предложением default.
  • Реализовать многонаправленное неблокирующее ветвление с использованием оператора select с несколькими предложениями case и предложением default.
$ go run non-blocking-channel-operations.go
no message received
no message sent
no activity

Ниже представлен полный код:

// Базовые отправки и получение из каналов блокирующие.
// Однако, мы можем использовать `select` с предложением `default` для
// реализации _неблокирующих_ отправок, получений и даже
// неблокирующих многонаправленных `select`.

package main

import "fmt"

func main() {
	messages := make(chan string)
	signals := make(chan bool)

	// Вот неблокирующее получение. Если значение доступно в `messages`,
	// то `select` будет использовать вариант `<-messages` с этим значением.
	// Если нет, то немедленно будет использоваться вариант `default`.
	select {
	case msg := <-messages:
		fmt.Println("received message", msg)
	default:
		fmt.Println("no message received")
	}

	// Неблокирующая отправка работает аналогично. Здесь `msg`
	// не может быть отправлено в канал `messages`, потому что
	// канал не имеет буфера и нет приемника.
	// Поэтому выбирается вариант `default`.
	msg := "hi"
	select {
	case messages <- msg:
		fmt.Println("sent message", msg)
	default:
		fmt.Println("no message sent")
	}

	// Мы можем использовать несколько вариантов `case` выше предложения `default`
	// для реализации многонаправленного неблокирующего ветвления.
	// Здесь мы пытаемся выполнить неблокирующие получение из обоих `messages` и `signals`.
	select {
	case msg := <-messages:
		fmt.Println("received message", msg)
	case sig := <-signals:
		fmt.Println("received signal", sig)
	default:
		fmt.Println("no activity")
	}
}

Резюме

В этом лабораторном проекте вы узнали, как реализовать неблокирующие операции с каналами с использованием оператора select с предложением default. Вы реализовали неблокирующее получение, неблокирующую отправку и многонаправленное неблокирующее ветвление.