Сазнајте како горрутине и канали омогућавају ефикасну истовременост у вашим Го програмима.
Конкуренција је кључни аспект модерног развоја софтвера јер омогућава програмима да ефикасно руководе више задатака истовремено. Можете писати програме који извршавају различите операције које доводе до побољшаних перформанси, одзива и коришћења ресурса.
Конкуренција је једна од карактеристика одговорних за брзо усвајање Го-а. Го-ова уграђена подршка за истовремено програмирање сматра се једноставном док помаже у избегавању уобичајених замки као што су услови трке и застоји.
Конкуренција у Го
Го пружа снажну подршку за истовременост кроз различите механизме, све доступне у својој стандардној библиотеци и ланцу алата. Го програми остварите паралелност преко горрутина и канала.
Горутине су лагане, независно извршавање функција које се покрећу истовремено са другим горрутинама унутар истог адресног простора. Горутине дозвољавају да више задатака напредују истовремено без експлицитног управљања нитима. Горутине су лакше од нити оперативног система и Го може ефикасно да покреће хиљаде или чак милионе горутина истовремено.
Канали су комуникациони механизам за координацију и дељење података између горутина. Канал је куцани провод који омогућава горутинама да шаљу и примају вредности. Канали обезбеђују синхронизацију да би се обезбедило безбедно дељење података између горрутина, док истовремено спречавају услове трке и друге уобичајене проблеме истовремености.
Комбиновањем горрутина и канала, Го обезбеђује моћан и директан модел истовремености који поједностављује развој истовремених програма уз одржавање безбедности и ефикасности. Ови механизми вам омогућавају лаку употребу вишејезгарни процесори и изгради високо скалабилне и прилагодљиве апликације.
Како користити горутине за истовремено извршавање кода
Го рунтиме управља горутинама. Гороутине имају свој стек, што им омогућава да имају лагани отисак са почетном величином стека од неколико килобајта.
Горутине се мултиплексирају на неколико нити ОС-а помоћу Го рунтиме-а. Го рунтиме планер их распоређује на доступне нити тако што ефикасно дистрибуира радно оптерећење, омогућавајући истовремено извршавање више горутина на мање нити ОС-а.
Креирање горрутина је једноставно. Користићете иди кључна реч праћена позивом функције за декларисање горрутина.
фунцглавни() {
иди функција1() // Креирај и изврши горутину за функцију1
иди функција2() // Креирајте и извршите гороутине за функцију2// ...
}фунцфункција1() {
// Код за функцију1
}
фунцфункција2() {
// Код за функцију2
}
Када програм позове функција1() и функција2() са иди кључну реч, Го рунтиме извршава функције истовремено као горутине.
Ево примера употребе горутине која штампа текст на конзоли:
пакет главни
увоз (
"фмт"
"време"
)фунцпринтТект() {
за ја := 1; и <= 5; и++ {
фмт. Принтлн(„Штампање текста“, и)
време. спавај(1 * време. друго)
}
}фунцглавни() {
иди принтТект() // Покрени гороутину да би истовремено извршила функцију принтТект// Обављање других задатака у главној горутини
за ја := 1; и <= 5; и++ {
фмт. Принтлн("Обављање других задатака", и)
време. спавај(500 * време. милисекунда)
}
// Сачекајте да се гороутина заврши
време. спавај(6 * време. друго)
}
Тхе принтТект функција више пута штампа неки текст на конзоли помоћу а за петља која се покреће пет пута након кашњења од једне секунде између сваке изјаве са временски пакет.
Тхе главни функција покреће горутину позивом иди принтТект, који покреће принтТект функционише као засебна конкурентна горрутина која дозвољава функцији да се извршава истовремено са остатком кода у главни функција.
Коначно, да би се осигурало да програм не изађе пре принтТект гороутине завршава, тхе време. Спавај функција паузира главну горутину на шест секунди. У стварним сценаријима, користили бисте механизме синхронизације као што су канали или групе чекања да бисте координирали извршавање горрутина.
Коришћење канала за комуникацију и синхронизацију
Горутине имају уграђену подршку за комуникацију и синхронизацију путем канала, чинећи писање истовременим код лакши од традиционалних нити, које често захтевају механизме за ручну синхронизацију као што су браве и семафори.
Канале можете замислити као цевоводе за проток података између горутина. Једна горутина може да пошаље вредност у канал, а друга горрутина може да прими ту вредност са канала. Овај механизам обезбеђује да размена података буде безбедна и синхронизована.
Користићете оператера за слање и примање података путем канала.
Ево примера који показује основну употребу канала за комуникацију између две горутине:
фунцглавни() {
// Креирајте канал без баферовања типа стринг
цх := направити(цханниз)// Горутина 1: Шаље поруку на канал
идифунц() {
цх "Здраво, Канал!"
}()
// Гороутине 2: Прима поруку са канала
порука := фмт. Принтлн (мсг) // Излаз: Здраво, канал!
}
Канал у главни функција је небаферовани канал под називом гл створен са направити() функција. Прва горутина шаље поруку "Здраво, канал!" у канал помоћу оператера, а друга горутина прима поруку са канала користећи истог оператера. Коначно, главни функција штампа примљену поруку на конзолу.
Можете дефинисати откуцане канале. Одредићете тип канала приликом креирања. Ево примера који показује употребу различитих типова канала:
фунцглавни() {
// Небаферовани канал
цх1 := направити(цханинт)// Баферовани канал капацитета 3
цх2 := направити(цханниз, 3)// Слање и пријем вредности са канала
цх1 42// Шаље вредност у цх1
вредност1 := // Примите вредност из цх1
цх2 "Здраво"// Шаље вредност у цх2
вредност2 := // Примите вредност из цх2
}
Тхе главни функција креира два канала: цх1 је канал са целим бројем без баферова, док цх2 је баферовани стринг канал капацитета 3. Можете слати и примати вредности на и са ових канала користећи оператор (вредности морају бити наведеног типа).
Можете користити канале као механизме синхронизације за координацију извршавања горутине коришћењем блокирајуће природе операција канала.
фунцглавни() {
цх := направити(цханбоол)идифунц() {
фмт. Принтлн("Гороутине 1")
цх истина// Сигнал завршетак
}()идифунц() {
// Сачекајте сигнал завршетка из Гороутине 1
фмт. Принтлн("Гороутине 2")
}()
// Сачекајте сигнал завршетка од Гороутине 2
фмт. Принтлн("Главна горутина")
}
Тхе гл канал је логичан. Две горрутине раде истовремено у главни функција. Гороутине 1 сигнализира свој завршетак слањем а истина вредност у канал гл. Гороутине 2 чека сигнал завршетка примањем вредности са канала. Коначно, главна горрутина чека сигнал завршетка од горрутине два.
Можете да правите веб апликације у Го Витх Гин-у
Можете да правите веб-апликације високих перформанси у Го витх Гин-у док истовремено користите Го-ове функције конкурентности.
Можете да користите Гин за ефикасно руковање ХТТП рутирањем и међувера. Искористите уграђену подршку за конкурентност у Го-у тако што ћете користити горутине и канале за задатке као што су упити у бази података, АПИ позиви или друге операције блокирања.