Раз уж завёл новый модуль, «Конкурентность», грех не рассказать, что в нём внутри, чуть подробнее, чем влезает в одну строчку анонса. Начну с первой главы — она про горутины, и с них, по-хорошему, начинается сам Go как язык для параллельной работы.
Горутина — это кусок кода, который выполняется не по очереди с остальной программой, а сам по себе, параллельно. Обычно код идёт строка за строкой, одна дожидается другой. Горутина — способ сказать «а вот эта часть пусть работает отдельно, не жди её, иди дальше».
В большинстве языков, чтобы так сделать, нужен отдельный объект-поток, пул под него, настройки размера — в общем, дело. В Go для этого есть одно слово.
go fetchWeather("Москва")
go fetchWeather("Питер")Вот и всё, обе функции побежали сами по себе, а рантайм сам разложит их по реальным ядрам процессора. И не только эти две — тысячи горутин запросто уживаются там, где обычная ОС-шная нить уже давно бы легла. Горутина занимает пару килобайт стека, который при необходимости растёт, а не фиксированные мегабайты, как у настоящего потока, поэтому «запустить ещё одну» почти ничего не стоит.
Нюанс в том, что «запустить» и «дождаться» — это разные глаголы. Горутина не «выполнись прямо сейчас», а «выполнись, когда получится, а мы пока пойдём дальше».
func main() {
go fetchWeather("Москва")
}
// main уже закончился, а горутина, скорее всего, даже не успела стартоватьЕсли её явно не дождаться, main может преспокойно закончиться раньше, чем горутина хоть что-то сделает — и в результате тишина вместо данных.
Про то, как её правильно ждать (и что будет, если сделать это неправильно), — в новом модуле курса, PRO Go для продвинутых.
В честь начала учебного года и выхода модуля дарю вам скидку 20% на курс❤️. Скидка действует ровно неделю.
