Что нужно для синхронизации Go Routines? - PullRequest
0 голосов
/ 16 сентября 2018

Этот конкретный код Go использует канал для синхронизации goroutines.

// We can use channels to synchronize execution
// across goroutines. Here's an example of using a
// blocking receive to wait for a goroutine to finish.

package main

import "fmt"
import "time"

// This is the function we'll run in a goroutine. The
// `done` channel will be used to notify another
// goroutine that this function's work is done.
func worker(done chan bool) {
   fmt.Print("working...")
   time.Sleep(time.Second)
   fmt.Println("done")

   // Send a value to notify that we're done.
   done <- true
}

func main() {

   // Start a worker goroutine, giving it the channel to
   // notify on.
   done := make(chan bool, 1)
   go worker(done)

   // Block until we receive a notification from the
   // worker on the channel.
   <-done
 }

Что необходимо для синхронизации процедур?Разве это не идея, что мы будем запускать программы с чередованием.Почему мы хотим ввести синхронизацию между двумя или более процедурами go?Это для обратных вызовов?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Если процессы можно запускать независимо, тогда все довольно просто.Мы можем запустить каждый процесс в ядре, и все будет легко.Проблемы возникают, когда процессы являются зависимыми (то есть процесс A зависит от процесса B).

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

0 голосов
/ 16 сентября 2018

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

  • Среда выполнения Go завершится, если достигнут конец метода main. В этот момент работающая программа, включая все другие программы, будет прервана. Координация здесь гарантирует, что детская программа была приостановлена ​​до того, как программе позволили выйти.

    Я писал о примере этого вчера: https://stackoverflow.com/a/52347990/1113760.

Вы можете представить себе множество других причин, требующих координации между параллельной работой (этот список не относится к Go и не является исчерпывающим):

  • Функции работают в области общей памяти, поэтому требуется координация в форме взаимного исключения, чтобы гарантировать, что только одна подпрограмма получает доступ к критическому разделу за один раз.

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

  • Ваша программа может предоставлять услугу, и вы хотите убедиться, что любые запросы в полете (обработанные в отдельных процедурах) были завершены и истощены перед завершением работы.

Этот вопрос выходит за рамки вопроса о рассмотрении трудностей информатики, связанных с одновременным исполнением, и примеров, в которых это полезно, поэтому в литературе будут представлены дополнительные подробности и примеры.

...