# #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
относится ли это к потребителю, ожидающему производителя, или это просто получение канала займет так много времени в пути