Как постоянно работает эта программа (как она работает)? - PullRequest
0 голосов
/ 27 апреля 2020

Основой моего понимания c является то, что это упрощенный способ создания потока.

Глядя на библиотеку confluent-kafka- go, следующий код приводится в качестве примера:

    go func() {
        for e := range p.Events() {
            switch ev := e.(type) {
            case *kafka.Message:
                if ev.TopicPartition.Error != nil {
                    fmt.Printf("Delivery failed: %v\n", ev.TopicPartition)
                } else {
                    fmt.Printf("Delivered message to %v\n", ev.TopicPartition)
                }
            }
        }
    }()

    // Produce messages to topic (asynchronously)
    topic := "myTopic"
    for _, word := range []string{"Welcome", "to", "the", "Confluent", "Kafka", "Golang", "client"} {
        p.Produce(&kafka.Message{
            TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
            Value:          []byte(word),
        }, nil)
    }

Как это работает? Разве он не просто запустится один раз и перестанет работать, как только пройдет через все p.Events()? Как go узнает, что не прерывает выполнение процедуры, но продолжает опрашивать p.Events() - даже если в большинстве случаев она будет пустой?

1 Ответ

4 голосов
/ 27 апреля 2020

Согласно документации для Producer.Events(), он возвращает канал.

Ранжирование по каналу прекращается только при закрытии канала. См. тур по Go для более подробной информации.

...