«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > GO: Параллелизм против параллелизма для чайников.

GO: Параллелизм против параллелизма для чайников.

Опубликовано 1 сентября 2024 г.
Просматривать:881

Добро пожаловать в этот пост с несколько унизительным названием.
Но в этом посте я хочу объяснить вам, что представляют собой эти две характеристики программирования, очень простым способом, на этот раз используя мой любимый язык программирования GOLANG.

Представим себе кухню:

Приготовить блюдо: это задание.
Повар: Он переработчик.
Совпадение:

На кухне несколько поваров: каждый готовит свое блюдо.
In Go: Каждый повар будет горутиной. Хотя на кухне (процессоре) есть только одна духовка, повара могут работать над блюдами одновременно, тратя время на другие задачи, ожидая, пока духовка освободится.
Параллелизм:

Различные духовки: У каждого повара своя духовка.
In Go: Если у нас есть несколько физических процессоров, каждая горутина может работать на другом процессоре, одновременно готовя несколько блюд в реальной жизни.

В чем разница?

Параллелизм: задачи выполняются взаимосвязанно, создавая иллюзию параллелизма даже на одном процессоре.
Параллелизм: задачи выполняются одновременно на нескольких процессорах, что значительно ускоряет процесс.

Как их использовать в Go?

Горутины: Они подобны легким нитям. Чтобы создать горутину, мы просто используем ключевое слово go перед функцией:

GO: Concurrencia vs Paralelismo Para Tontos.

Давайте посмотрим пример того, как мы можем использовать горутины в golang:

go func() {
    // Código que se ejecutará en una goroutine
}()

Каналы: это каналы, через которые горутины могут взаимодействовать и синхронизироваться.
Представьте, что это трубки, по которым ингредиенты передаются между поварами

ch := make(chan int)
go func() {
    ch 



Практический пример:

package main

import (
    "fmt"
    "time"
)

func worker(id int, c chan int) {
    for n := range c {
        fmt.Printf("Worker %d received %d\n", id, n)
        time.Sleep(time.Second)
    }
}

func main() {
    c := make(chan int)

    for i := 1; i 



Вывод этого кода будет

Worker 1 received 1
Worker 2 received 2
Worker 3 received 3
Worker 4 received 4
Worker 5 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 4 received 9
Worker 5 received 10

хотя иногда это может выглядеть так

Worker 5 received 1
Worker 1 received 3
Worker 2 received 2
Worker 4 received 5
Worker 3 received 4
Worker 3 received 6
Worker 5 received 10
Worker 2 received 8
Worker 4 received 7
Worker 1 received 9

или вот так

Worker 5 received 1
Worker 1 received 2
Worker 2 received 3
Worker 3 received 4
Worker 4 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 5 received 9
Worker 4 received 10

Почему вывод меняется каждый раз, когда я запускаю программу?

Основная причина, по которой выходные данные программы изменяются при каждом выполнении, связана с недетерминированной природой параллелизма.

Вот что происходит:

Создать канал: make(chan int) создает канал целых чисел. Этот канал будет использоваться для связи между горутинами.

Запуск горутины: Цикл для i := 1; я Рабочая функция получает идентификатор и канал.

Отправить значения в канал: Цикл для n := 1; п 1 до 10 в канал.

Закрыть канал: вызов close(c) закрывает канал, указывая, что больше значения отправляться не будут.

Получить значения из канала: Каждая горутина получает значения из канала с помощью цикла c for n := range. Когда значение получено, оно выводится на консоль.

Дождитесь завершения горутин: вызов time.Sleep(time.Second) гарантирует, что основная горутина ожидает завершения других горутин перед выходом.

До настоящего времени:

Создаем 5 горутин (куков), которые получают номера через канал.
Отправляем цифры в канал для обработки поварами.
Повара работают одновременно, обрабатывая цифры по мере их поступления.

Зачем использовать параллелизм и параллелизм в Go?

Более высокая производительность: особенно в задачах, связанных с вводом-выводом (например, чтение файлов или выполнение HTTP-запросов).
Повышенная скорость реагирования: приложение может продолжать отвечать на другие запросы, пока задача заблокирована.
Более масштабируемые архитектуры: вы можете распределять работу между несколькими ядрами или компьютерами.

Помнить!

Параллелизм и параллелизм — мощные инструменты, но они также могут усложнить понимание и отладку кода. Важно использовать их осторожно и понимать их последствия.

Хотите углубиться в конкретную тему?

Мы можем изучить такие понятия, как:

Синхронизация: мьютексы, рабочие группы и т. д.
Шаблоны параллелизма: производитель-потребитель, конвейер и т. д.
Параллельное тестирование: как эффективно тестировать параллельный код.

Привет,
Лукатонни Раудалес

X/Твиттер
Гитхаб

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/lucatonyraudales/go-concurrencia-vs-paralelismo-para-tontos-2fnn?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3