Advertisement
AlexNovoross87

ASYNCHRONIC

May 15th, 2025
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 6.69 KB | None | 0 0
  1. Что такое горутины?
  2. Горутины являются ключевой особенностью языка Go.
  3. Они представляют собой легковесные потоки выполнения
  4. Горутины позволяют параллельно выполнять несколько задач в одной программе
  5.  
  6.  
  7. Преимущества горутин
  8. ---------------------
  9. Эффективное использование ресурсов: горутины обладают низким потреблением
  10. памяти и быстрым запуском.
  11. Простая синхронизация: использование каналов и синхронизаторов позволяет
  12. безопасно обмениваться данными между горутинами.
  13. Удобство работы с параллельными задачами: горутины упрощают разработку
  14. параллельных алгоритмов.
  15.  
  16. Создание горутин
  17. ----------------
  18. Горутины создаются с помощью ключевого слова до,
  19. после которого следует вызов функции
  20.  
  21. Пример создания горутины: go myFunction()
  22.  
  23.  
  24. func myFunction() {
  25.     fmt.PrintLn("Выполнение в горутине")
  26.     time.Sleep(time.Second) // Имитация работы горутины
  27.     fmt.PrintLn("Горутина выполнена")
  28. }
  29.  
  30. func main() {
  31. fmt.Println("Старт основной горутины")
  32. go myFunction() // Создание и запуск горутины
  33. fmt.PrintLn("Основная горутина продолжает работу")
  34. // Ожидание завершения выполнения горутины
  35. time.Sleep(2 * time.Second)
  36. fmt.PrintLn("Выполнение программы завершено")
  37. }
  38.  
  39. ===================================================================================
  40.  
  41. Каналы для обмена данными
  42. --------------------------
  43. Каналы предоставляют способ безопасного обмена данными между горутинами
  44. Они могут быть использованы для передачи значений от одной горутины к другой
  45. Пример создания канала: ch := make(chan int)
  46.  
  47. func main() {
  48.     // Создание канала типа int
  49.     ch := make(chan int)
  50. // Горутина, которая отправляет значения в канал
  51. go func() {
  52. for t := 1; i <= 5; i++ {
  53.     ch <- i // Отправка значения в канал
  54.     }
  55. close(ch) // Закрытие канала
  56. }()//сразу запустится
  57. // Чтение значений из канала
  58.    for num := range ch {
  59. fmt.Println(num) // Вывод значения из канала
  60.    }
  61. }
  62.  
  63. ==================================================================================
  64. Синхронизация с помощью WaitGroup
  65. ----------------------------------
  66. WaitGroup предоставляет механизм синхронизации выполнения горутин
  67. Он гарантирует, что все горутины завершат свою работу, прежде чем
  68. программа завершится.
  69.  
  70. Пример использования WaitGroup: var wg sync.WaitGroup
  71.  
  72. func worker(id int, wg *sync.WaitGroup) {
  73.             defer wg.Done() // Указываем, что горутина завершила свою работу
  74.             fmt.Printf("Горутина %d завершила свою работу\п", id)
  75. }
  76.  
  77. func main() {
  78. var wg sync.WaitGroup // Создание WaitGroup
  79. for i := 1; i <= 3; i++ {
  80. wg.Add(l) // Увеличение счетчика горутин в WaitGroup
  81. go worker(i, &wg) // Запуск горутин
  82. }
  83.  
  84. wg.Wait() // Ожидание завершения всех горутин
  85. fmt.Println("Все горутины завершили работу")
  86. }
  87.  
  88. ===========================================================================
  89.  
  90. В Go оператор select используется для работы с несколькими каналами одновременно.
  91. Он позволяет горутине ожидать операций на нескольких каналах и реагировать на тот
  92. канал, который первым станет готов к отправке или получению данных. Это ключевой
  93. инструмент для организации конкурентных (параллельных) программ и координации
  94. работы между горутинами.
  95.  
  96. Как работает select
  97. select блокируется и ждёт, пока хотя бы одна из операций над каналами в его
  98. кейсах станет возможной.
  99. Если готово несколько каналов одновременно, выбирается случайный кейс.
  100. Если ни один канал не готов, select блокируется до появления возможности
  101. выполнить хотя бы одну операцию.
  102. Можно добавить опциональный кейс default - он выполнится, если ни один канал
  103. не готов, и select не будет блокироваться.
  104.  
  105. Синтаксис
  106.  
  107. select {
  108. case val := <-ch1:
  109.     // обработка данных из ch1
  110. case ch2 <- msg:
  111.     // отправка данных в ch2
  112. default:
  113.     // выполняется, если ни один канал не готов (необязательно)
  114. }
  115. Пример использования
  116.  
  117. package main
  118.  
  119. import (
  120.     "fmt"
  121.     "time"
  122. )
  123.  
  124. func main() {
  125.     //Создаётся канал ch типа int.
  126.     ch := make(chan int)
  127.     //В отдельной горутине через 2 секунды в канал отправляется значение 42.
  128.     go func() {
  129.         time.Sleep(2 * time.Second)
  130.         ch <- 42
  131.     }()
  132.    
  133.     //В основном потоке выполняется select: если из канала приходит
  134.     значение - оно выводится, если нет - через 3 секунды срабатывает таймаут
  135.     select {
  136.     case val := <-ch:
  137.         fmt.Println("Получено значение из канала:", val)
  138.     case <-time.After(3 * time.Second):
  139.         fmt.Println("Таймаут ожидания")
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement