Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Golang и “concurrency”

#golang


На официальной русской страничке документации Golang сообщается:


  Термин "concurrency" в
  программировании, судя по всему, не
  имеет точного аналога в русском языке.
  Хотя многие переводят его как
  "параллелизм", это ошибка (см.
  Parallelism is not concurrency), так
  же как в математике "concurrent lines"
  — вовсе не "параллельные прямые", а
  прямые, имеющие общую точку. Русский
  язык резиновый, он выдержит еще один
  термин: "конкарентность",
  "конкарентный".


Это замечание, тем не менее, совершенно не раскрывает само понятие и суть явления
этого "concurrency". В чем оно заключается?

Дополнение:
С учетом вот этого вопроса, я так понимаю, что goroutine НЕ выполняются параллельно
(не в геометрическом, а в смысле одновременного выполнения). Только как это все работает
и что под этим подразумевается все равно не понимается.
    


Ответы

Ответ 1



Заключается в том, что в каком-то месте программы образуется «вилка» из нитей выполнения кода. Т.е. до этого места логическая цепочка была одна и последовательная, но в этом месте она раздваивается и дальше идёт уже две логических цепочки последовательных действий, выполняемых параллельно. Далее, обычно, они сливаются обратно, либо какие-то ветви просто прекращают существовать отработав свою логику. Т.е. термин достаточно точный, просто непосвящённый человек может подумать в рамках геометрии, что раз параллельные потоки, то они не пересекаются, а это не совсем так. Они параллельны не везде.

Ответ 2



Если говорить о примере из Вашего вопроса, то там проблема заключается в том что одина рутина пишет в переменную в инфинити лупе, в то время как другая рутина пытается получить доступ к той же переменной(как я это вижу). Если, к примеру, поставить паузу в цикле который пишет в переменную, то main будет выводить новое значение переменной: type myInt struct { Value int64 } func (i *myInt) add(x int64) int64 { i.Value += x return i.Value } func (i *myInt) setValue(x int64) { i.Value = x } func (i *myInt) getValue() int64 { return i.Value } var x myInt func inc_x() { //test for { x.add(1) time.Sleep(1 * time.Nanosecond) } } func main() { go inc_x() for { fmt.Print("x=") fmt.Println(x.getValue()) // time.Sleep(1 * time.Second) } }

Комментариев нет:

Отправить комментарий