
Nikolay
25.06.2018
16:46:54
а мы про асинхронщину говорим, это немного другое

Алексей
25.06.2018
16:47:24
(кстати, совершенно зря)
просто асинхронщина там глубоко под капотом, куда не добраться и она собственно скрыта от go программиста, и горутины действуют почти как легковесные потоки

Nikolay
25.06.2018
16:48:27

Алексей
25.06.2018
16:49:13

Google

Alex
25.06.2018
16:49:22

Andy
25.06.2018
16:49:27

Алексей
25.06.2018
16:49:29
там она совершенно не на виду

Nikolay
25.06.2018
16:50:27

Алексей
25.06.2018
16:51:03

Nikolay
25.06.2018
16:51:20
и будет да
вот в го как раз реализовали

Алексей
25.06.2018
16:51:51
Потому что замени в твоём сообщении "горутина" на поток и будет как раз многопоточность

Nikolay
25.06.2018
16:52:40
ну так это не взаимоисключающие понятия же
асинхронность можно реализовывать поверх многопоточности, что в го и сделали

Алексей
25.06.2018
16:54:32
а откуда ты знаешь что там асинхронный IO внутри?

Google

Алексей
25.06.2018
16:55:31
любой человек может написать свой go runtime с классической многопоточностью и никто и не заметит подмены (по крайней мере сразу, без задействования весьма большого количества горутин)

Nikolay
25.06.2018
16:56:23

Алексей
25.06.2018
16:56:55
я вообще про то, что там как бы код Go абстрагирован от всей асинхронщины

Nikolay
25.06.2018
16:57:01
без мультиплексирования оно будет работать крайне медленно
но не перестанет быть асинхронным
та же логика

Проксимов
25.06.2018
16:58:23

Алексей
25.06.2018
16:58:29
чёт я запутался

Nikolay
25.06.2018
16:58:42

Алексей
25.06.2018
17:00:10
у меня тут утиная типизация протекла немножко походу

Nikolay
25.06.2018
17:00:16
чёт я запутался
ну, если я правильно понял твою предъяву, "по коду го не видно, что он внутри асинхронный". Так вот, встречная тема - по коду asyncio тоже непонятно, есть там потоки или нет.

Алексей
25.06.2018
17:00:47
ну это кстати скорее плюс чем минус Go
просто для меня go выглядит как синхронный язык с синхронными операциями
просто они синхронны не по отношению к потокам
а по отношению к горутинам
то есть код в горутинах полностью синхронен, там нельзя запустить две операции одновременно без создания новых горутин
выглядит как синхронный код, плавает как синхронный код, крякает как синхронный код,

Nikolay
25.06.2018
17:02:48

Google

Алексей
25.06.2018
17:02:59
опять же "синхронизация" - это прям вот из многопоточности пришло

Nikolay
25.06.2018
17:03:39
чёёё?
ну, например, ты знаешь select {} в го? каким боком он похож на синхронный код?

Aragaer
25.06.2018
17:04:43
он очень синхронен

Алексей
25.06.2018
17:04:47
так select же блочит горутину

Aragaer
25.06.2018
17:04:49
такой же, как и select в позиксе

Nikolay
25.06.2018
17:05:34

Алексей
25.06.2018
17:06:04
но ведь в go фактически всё блочит горутину
ну кроме конечно же запуска новой горутины

Nikolay
25.06.2018
17:06:41
но горутины-то при этом параллельно работают все равно

Алексей
25.06.2018
17:06:48
как и потоки
вообще на самом деле это я запутался

Aragaer
25.06.2018
17:07:24
а про select-то тут причем? Он в каком месте "параллельно работает"?

Nikolay
25.06.2018
17:09:01

Алексей
25.06.2018
17:10:08
Дело в том, что походу про асинхронность особо нет смысла говорить в отрыве от IO. К примеру в англоязычной википедии есть как раз статься про асинхронный IO. То есть не про асинхронность, а именно про асинхронный IO. И там есть три примера: блокирующий синхронный, неблокирующий синхронный, неблокирующий асинхронный. И Go как раз добавляет четвёртый и самый удобный тип: блокирующий асинхронный.

Aragaer
25.06.2018
17:10:10
позиксовый селект же как-то работает

Nikolay
25.06.2018
17:10:50

Aragaer
25.06.2018
17:10:59
а блочится он именно на select
все просто - процесс блочится, а когда ему снова передается управление, проверяет наличие любого из нескольких событий

Nikolay
25.06.2018
17:11:19

Google

Nikolay
25.06.2018
17:11:47
точнее, сам по себе нет, но мультиплексирование, которое он позволяет делать - уже да

Aragaer
25.06.2018
17:11:48
ок

Алексей
25.06.2018
17:12:10
я окончательно запутался

Aragaer
25.06.2018
17:12:24
я наверно не очень понимаю разницу между "синхронным" и "асинхронным"

Nikolay
25.06.2018
17:12:56
я окончательно запутался
да что непонятно-то? есть эвентлуп, есть корутины. Есть переключение контекста явное. Есть при этом i/o или нет его - это отдельный вопрос, в общем случая для асинхронности он не нужен

Aragaer
25.06.2018
17:13:05
я привык считать событие синхронным, если я проверяю его наличие и если есть, то оно случилось, а пока нет - я о нем не знаю

Nikolay
25.06.2018
17:13:39
параллельность - это выполнение нескольких кусков кода параллельно. Асинхронность - это выполнение нескольких кусков кода НЕ последовательно, но необязательно параллельно

Aragaer
25.06.2018
17:13:46
а асинхронным, если оно может "случиться" (и требовать обработки) в любой момент времени - чем бы ни был занят мой "синхронный" код в это время

Nikolay
25.06.2018
17:14:12

Aragaer
25.06.2018
17:14:21
ок, то есть если есть селект на два события, но порядок этих событий неизвестен, то это называется асинхронным
понял

Nikolay
25.06.2018
17:15:46

Алексей
25.06.2018
17:16:48
точнее не так даже
верно ли, что если мы не прыгаем непоследовательно в разные части кода для обработки, то это синхронно?

Nikolay
25.06.2018
17:18:44
только в контексте многопоточности ты прыгаешь не явно, а за тебя прыгает системный шедулер

Алексей
25.06.2018
17:19:30
то есть если я пишу на Go, без оператора select, то я пишу синхронный код?

Nikolay
25.06.2018
17:19:38
поэтому многопоточность тоже может реализовывать асинхронность

Алексей
25.06.2018
17:19:52
правда тогда прыгает шедьюлер go

Google

Nikolay
25.06.2018
17:20:10
но и то есть нюансы внутренние

Алексей
25.06.2018
17:20:30
уф

Aragaer
25.06.2018
17:20:51
и без селектов

Tishka17
25.06.2018
17:20:53
Вы все это время разбирали, что асинхронность перпендикулярна многопоточности?

Aragaer
25.06.2018
17:20:53
и без каналов

Nikolay
25.06.2018
17:20:59
это как в нодежсе, где, якобы, все в одном потоке, а на деле нода потоки запускает сама по мере надобности

Алексей
25.06.2018
17:21:16
но JS ни про какие потоки не знает

Nikolay
25.06.2018
17:21:35

Алексей
25.06.2018
17:21:44
неа
даже вм не знает походу

Nikolay
25.06.2018
17:21:57
и часть асинхронных вещей реализует именно за счет многопоточности

Алексей
25.06.2018
17:21:59
только рантайм ноды

Tishka17
25.06.2018
17:22:07

Nikolay
25.06.2018
17:22:08
ну да, я про ноду сейчас
v8 не знает, наверное

Алексей
25.06.2018
17:22:35

Nikolay
25.06.2018
17:23:06
а воркеры - это, вроде, процессы

Алексей
25.06.2018
17:23:21
просто у v8 вроде бы есть (точно была) такая "замечательная" особенность, как строго один интерпретатор на процесс