Назад
Go concurrency distilled: безплатна мінікнига про конкурентність у Go
SiTech AI Team2 წთ. საკითხავი

Go concurrency distilled: безплатна мінікнига про конкурентність у Go

Антон Жиянов опублікував безплатну мінікнигу «Go concurrency distilled». Це швидке повторення конкурентного програмування в Go, а не курс для початківців: від горутин і каналів до context, мʼютексів, атоміків і діагностики в продакшені.

Антон Жиянов, автор блогу antonz.org про Go, 26 вересня опублікував безплатну мінікнигу «Go concurrency distilled». Автор називає її швидким повторенням конкурентного програмування в Go, а не курсом для початківців: тим, хто хоче вивчати конкурентність з нуля та з практичними вправами, адресовано його попередню книгу «Gist of Go: Concurrency». Нова книга, за словами автора, написана без AI.

Повний текст працює у браузері з інтерактивними прикладами: код кожного фрагмента можна змінити й запустити прямо на сторінці. PDF-версія зі статичними прикладами лежить у репозиторії nalgeon/go-conc-distilled на GitHub.

Від горутин до pipeline-ів

Перші розділи охоплюють основи: горутини, що запускаються ключовим словом go, wait group-и для їх синхронізації та канали, якими горутини передають значення одна одній, — небуферизовані, буферизовані, закриті та nil. Далі йде select, який мультиплексує потоки даних, скасовує горутини та виконує неблокуючі операції.

Окремий розділ присвячено pipeline-ам, де кожен крок читає з одного каналу й пише в інший, і обробці помилок: повернення на першій помилці, пакування відповіді та помилки в один тип результату або збирання помилок в окремий канал.

Час, context і синхронізація

Час отримує власний розділ: time.After для таймаутів, таймери для відкладеної роботи й ticker-и для періодичних завдань, з порадою скидати один таймер у циклі, а не створювати новий на кожній ітерації. Context, основне призначення якого — скасовувати операції вручну, за таймаутом або дедлайном, пояснюється разом із його шаруватою будовою: дочірній context може лише скоротити дедлайн батьківського, а багаторазові виклики cancel безпечні. Описано також власні причини скасування та функції очищення через context.AfterFunc.

Далі — примітиви синхронізації: wait group-и з новішим методом Go, мʼютекси з TryLock і RWMutex, семафори, умовні змінні з signal і broadcast, sync.Once, sync.Pool для зменшення навантаження на збирач сміття та атомарні операції. Автор наголошує на різниці між гонкою даних, яку ловить race detector з прапорцем -race, і race condition, яку він не ловить.

Тестування, планування та діагностика

У тестах книга радить спиратися на точки синхронізації, які код уже надає: канали або типи з методом Wait. Там, де їх немає, стає в пригоді пакет synctest: він виконує тест в ізольованій бульбашці з фальшивим годинником, тож перевірки, залежні від часу, минають миттєво.

Останні розділи присвячено планувальнику, який розподіляє горутини між потоками ОС (горутині потрібно близько 2 КБ стека), та діагностиці в продакшені: пакету runtime/metrics, профілювальнику pprof із профілями CPU, heap, goroutine, block і mutex, трасуванню через go tool trace та flight recording, який тримає свіжий трейс у ковзному вікні.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.