Назад к вопросам
Junior
103
questionbank

В чем разница между конкурентностью и параллелизмом?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Конкурентность — свойство системы решать множество задач одновременно. Это не обязательно означает выполнение задач в один и тот же момент времени. На одном ядре процессора конкурентность может быть достигнута путем переключения между задачами (чередование).

Параллелизм — свойство системы выполнять множество задач в один и тот же момент времени. Для этого требуется несколько ядер процессора или несколько процессоров.

Свойство Конкурентность Параллелизм
Цель Справиться с большим количеством задач Быстро выполнять много задач
Выполнение Чередованием (на одном ядре) или параллельно (на нескольких) Одновременно (на нескольких ядрах)
Требования Может быть достигнут на одном ядре Требует нескольких ядер или процессоров
Пример Горутины в Go Выполнение goroutine на разных ядрах CPU

Конкурентность — это способствовать решению многих задач "одновременно", в то время как параллелизм — это фактическое выполнение многих задач "одновременно". Go поддерживает и то, и другое: goroutine обеспечивают конкурентность, а планировщик Go может распределять их по доступным ядрам для достижения параллелизма.

// Пример конкурентности (на одном ядре)
func printA() {
  for i := 0; i < 5; i++ {
    println("A")
  }
}

func printB() {
  for i := 0; i < 5; i++ {
    println("B")
  }
}

func main() {
  go printA() // Горутина 1
  go printB() // Горутина 2
  // Планировщик GoS может переключаться между printA и printB
  // на одном ядре, создавая иллюзию одновременного выполнения.
  // time.Sleep(time.Second) // Дать время горутинам завершиться
}
// Пример потенциального параллелизма (на нескольких ядрах)
// Если есть несколько ядер CPU, планировщик Go может
// запустить printA на одном ядре и printB на другом
// одновременно.
func printA() {
  for i := 0; i < 5; i++ {
    println("A")
  }
}

func printB() {
  for i := 0; i < 5; i++ {
    println("B")
  }
}

func main() {
  //runtime.GOMAXPROCS(2) // Установить количество используемых ядер
  go printA() // Горутина 1
  go printB() // Горутина 2
  // Если есть несколько ядер, эти горутины могут выполняться параллельно
  // time.Sleep(time.Second) // Дать время горутинам завершиться
}