Большая задержка при отправке / получении канала Go? (Отслеживание PProf)

# #go #channel #producer-consumer #goroutine #pprof

Вопрос:

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

Мне трудно в это поверить, так что это говорит о том, что отправка/прием по каналу go занимает так много времени, или это относится только к отставанию производителя, что приводит к chanrecv блокировке. И потенциально, как я могу сделать это более эффективным?

Пример кода:

 func consume(in chan User) {
    out := make(chan UserDetail)
    go func() {
        for user := range in {
            if userDetail, err := getUserDetails(user); err == nil {
                out <- userDetail
            }
        }
        close(out)
    }()
    return out
}

func produce() {
    out := make(chan User)
    go func() {
        // could be issuing a paginated api call to get users list
        for user := range users {
            out <- user
        }
        close(out)
    }()
    return out
}


func main() {
    userChan := produce() // get all users
    userDetailChannels := []chan User

    // fanout to 8 workers
    for workerIndex := 0; workerIndex < 8; workerIndex   {
        userDetailChannels = append(userDetailChannels, consume(userChan))
    }
}
 

введите описание изображения здесь

Комментарии:

1. Самый простой первый шаг-установить размер буфера канала на некоторое число > 0.

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

3. Голосование за закрытие, так как мы не можем воспроизвести проблему по показанным деталям

4. @Hymnsford, спасибо тебе! это действительно сокращает задержку вдвое, но все же любопытно, chanrecv относится ли это к потребителю, ожидающему производителя, или это просто получение канала займет так много времени в пути