0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p><strong>Инструменты параллельного программирования</strong>позволят вам облегчить выражение даже в случае немногопоточности. Рассмотрим пример, извлеченный из RPC-пакета.</p>
1
<p><strong>Инструменты параллельного программирования</strong>позволят вам облегчить выражение даже в случае немногопоточности. Рассмотрим пример, извлеченный из RPC-пакета.</p>
2
<p>Итак, у нас есть клиентская программа, которая выполняет цикл получения данных из какого-нибудь источника, допустим, сети. Во избежание выделения и освобождения буферов, программа сохраняет свободный список, а также применяет буферизованный канал для его представления. В том случае, когда канал пуст, происходит выделение нового буфера. Если же буфер сообщений готов, то он отправляется на сервер<strong>serverChan</strong>.</p>
2
<p>Итак, у нас есть клиентская программа, которая выполняет цикл получения данных из какого-нибудь источника, допустим, сети. Во избежание выделения и освобождения буферов, программа сохраняет свободный список, а также применяет буферизованный канал для его представления. В том случае, когда канал пуст, происходит выделение нового буфера. Если же буфер сообщений готов, то он отправляется на сервер<strong>serverChan</strong>.</p>
3
<p>Таким образом, цикл сервера получает каждое сообщение от клиента, а потом обрабатывает его с последующим возвращением буфера в свободный список.</p>
3
<p>Таким образом, цикл сервера получает каждое сообщение от клиента, а потом обрабатывает его с последующим возвращением буфера в свободный список.</p>
4
<p>Идем дальше: клиент пытается получить буфер из<strong>freeList</strong>. В том случае, если ни один из них не доступен, выделяется новый. При этом отправка сервером в<strong>freeList</strong>возвращает<strong>b</strong>в перечень свободных, но только в том случае, когда список не полный. В обратном случае буфер выбрасывается с целью его последующей утилизации сборщиком мусора (условие<strong>default</strong>в select-операторах выполняются лишь тогда, когда ни один другой случай не является готовым, что означает следующее:<strong>select</strong>никогда не блокируется.) Следовательно, вышеописанная реализация создает список без утечек памяти, причем всего в несколько строк, полагаясь при этом на буферизованный канал + сборщик мусора для учета.</p>
4
<p>Идем дальше: клиент пытается получить буфер из<strong>freeList</strong>. В том случае, если ни один из них не доступен, выделяется новый. При этом отправка сервером в<strong>freeList</strong>возвращает<strong>b</strong>в перечень свободных, но только в том случае, когда список не полный. В обратном случае буфер выбрасывается с целью его последующей утилизации сборщиком мусора (условие<strong>default</strong>в select-операторах выполняются лишь тогда, когда ни один другой случай не является готовым, что означает следующее:<strong>select</strong>никогда не блокируется.) Следовательно, вышеописанная реализация создает список без утечек памяти, причем всего в несколько строк, полагаясь при этом на буферизованный канал + сборщик мусора для учета.</p>
5
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
5
<p><em>По материалам https://golang-blog.blogspot.com/.</em></p>
6
6