Текущий буфер в Go | OTUS

Текущий буфер в Go

Инструменты параллельного программирования позволят вам облегчить выражение даже в случае немногопоточности. Рассмотрим пример, извлеченный из RPC-пакета.

Итак, у нас есть клиентская программа, которая выполняет цикл получения данных из какого-нибудь источника, допустим, сети. Во избежание выделения и освобождения буферов, программа сохраняет свободный список, а также применяет буферизованный канал для его представления. В том случае, когда канал пуст, происходит выделение нового буфера. Если же буфер сообщений готов, то он отправляется на сервер serverChan.

1-1801-756cda.png

Таким образом, цикл сервера получает каждое сообщение от клиента, а потом обрабатывает его с последующим возвращением буфера в свободный список.

2-1801-c3c40b.png

Идем дальше: клиент пытается получить буфер из freeList. В том случае, если ни один из них не доступен, выделяется новый. При этом отправка сервером в freeList возвращает b в перечень свободных, но только в том случае, когда список не полный. В обратном случае буфер выбрасывается с целью его последующей утилизации сборщиком мусора (условие default в select-операторах выполняются лишь тогда, когда ни один другой случай не является готовым, что означает следующее: select никогда не блокируется.) Следовательно, вышеописанная реализация создает список без утечек памяти, причем всего в несколько строк, полагаясь при этом на буферизованный канал + сборщик мусора для учета.

По материалам https://golang-blog.blogspot.com/.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто