Vanya
промизы/асинк эвэйт/реактивное программирование
Сережа
это как в джава9? ленивые стримы?
Roman
это как в джава9? ленивые стримы?
не знаком с Java stream'ами, однако часто слышу
Roman
промизы/асинк эвэйт/реактивное программирование
верно, в QuickStreams я пошёл чуток дальше и добавил в reactive programming стримы стримы можно представить себе как Promise'ы на стеройдах (abortable, pausable, resumable, attachable, nested abstractions)
Roman
однако в Go такие подходы не нужны ибо тут green threads отменяют нужды в асинхронном коде
Roman
но поскольку в Go важно понимание синхронизации (multithreaded programming) походу выходит что event loop новичкам и разработчикам более высокого уровня на самом деле будет легче
Daniel
на самом деле - седые строгие отцы не зря продвигают каналы для межгорутинного общения
Daniel
канал довольно удачно прячет синхронизацию внутри
Michael
+1
Daniel
удачно с точки зрения абстракции. с точки зрения производительности каналы так себе решение
Roman
в то время как race conditions и т.д. дебажить относительно сложно да и само по себе multithreaded программирование тема не из простых - асинхронное программирование легче дебажить и если блокировать loop то это заметно снижает производительность
Roman
удачно с точки зрения абстракции. с точки зрения производительности каналы так себе решение
не спорю, однако это не меняет факт что channel это в конце концов тоже лишь mutex конструкция и рано или поздно чел встретится с проблемами синхронизации, например когда 2 рутины обрабатывают один map
Roman
а как заблокировать eventloop? про какой язык речь тут?
да очень просто, язык тут абсолютно не при чём, суть в том, что вся бизнес логика выполняется в одном потоке, если писать блокирующий код то это будет существенно тормозить процесс
Roman
поэтому код в эвент лупе нужно писать в асинхронном стиле (callbacks / promises & futures / streams / reactive)
Anonymous
да
Roman
в 1.9 появился синхронизированный map, все видели?
ну окей, тем не менее так или иначе в некоторых случаях синхронизировать код надо ручками, в event loop'е такой потребности нет в принципе
Aleksand
да очень просто, язык тут абсолютно не при чём, суть в том, что вся бизнес логика выполняется в одном потоке, если писать блокирующий код то это будет существенно тормозить процесс
при чем, не в каждом дают такую возможность - блокировать eventloop и вообще управлять им, но в целом по сути сказанного спорить не о чем
Daniel
интересно, что java начинала с синхронизированных структур, но уже в 1.2 появились несинхронизированные версии - слишком велики были performance penalty
Daniel
а go зашел с другой стороны, но все равно без двух версий не обошлось
Roman
при чем, не в каждом дают такую возможность - блокировать eventloop и вообще управлять им, но в целом по сути сказанного спорить не о чем
что значит "дают возможность"... тут же всё элементарно: если мы пишем слишком много кода для выполнения в одном цикле event loop'а - мы его неизбежно блокируем..
Roman
без конкретной реализации eventloop это разговор безадресный
по вашему event loop можно написать таким образом, что вычисление числа фибоначчи до хрендевятисятой степени не сможет его заблокировать?))
Aleksand
в питоне eventloop заблокировать можно, в nodejs нельзя, если не использовать специально созданные ружья для выстрела в ногу)
Roman
в питоне eventloop заблокировать можно, в nodejs нельзя, если не использовать специально созданные ружья для выстрела в ногу)
нельзя?! это как?)))) как-раз таки в Node это проблема очень частая особенно для новичков
Aleksand
и если eventloop пулит такие задачи по тредам то все ок будет
Daniel
eventloop перепендикулярен тредам, можно ввод-вывод сделать на эвентлупе, а колбеки на тредах
Daniel
собственно java nio
Aleksand
уровень доступа к eventloop в ноде нулевой, ты этой абстракцией не управляешь, а в питоне управляешь напрямую
Roman
оно заблокирует не evetloop а нить
возможно ты неправильно понял, речь идёт об использовании той или иной технологии с точки зрения программиста пользователя если написать в бизнес логике вычисление числа фибоначчи до уровня 10^999 то event loop повиснет, ибо бизнес логика выполняется не в нитях async IO, а в main thread'e и этого к сожалению многие особенно в начале не понимают и блокируют тем самым луп значитльно снижая производительность процесса
Roman
на thread pool'е выполняется код к которому ты как пользователь в основном не имеешь доступа, это реализация того или иного API
Roman
например filesystem API, network API и т.д. и т.п.
Сережа
конкретно в ноде и в libuv есть пул потоков
Aleksand
Aleksand
он там свою сомнительную магию делает
Сережа
все блокируемые вызовы нода наверное выполняет в потоке из пула
Сережа
операции с файлами и т.д.
Roman
конечно же у event loop'а есть thread pool для параллельного исполнения нескольких задач одновременно.. но речь идёт о БИЗНЕС ЛОГИКЕ
Aleksand
операции с файлами и т.д.
да, libuv через тредпул
Roman
если бизнес логика написана в синхронном стиле то это для event loop'а катастрофа
Roman
вот что собственно имеется ввиду
Aleksand
если бизнес логика написана в синхронном стиле то это для event loop'а катастрофа
если ребенка подпустить к розетке тоже будет трагедия, надо втыкать заглушки туда
Anatoly
заглушек нет, дети целы
Anatoly
да и вообще аналогия - сомнительный приём
Anatoly
хорошо что в го не эвентлуп с коллбеками
Roman
хороший специалист блокирующий код писать не будет, но их к сожалению не так много на самом деле потому-что сама идея асинх. прогр. пока ещё довольно нова в мейнстриме
Anatoly
расходимся
Aleksand
вот что собственно имеется ввиду
ну конкретно в ноде можно линтить вызов sync-методов и не давать их использовать, в питоне не давать работать с eventloop напрямую в продукте реализующим бизнес, писать асбтракции исключающие это
Roman
ну конкретно в ноде можно линтить вызов sync-методов и не давать их использовать, в питоне не давать работать с eventloop напрямую в продукте реализующим бизнес, писать асбтракции исключающие это
использование sync методов это лишь одна из возможностей блокировки которая на самом деле не так часта как другие, порой особенно в Node javascript используется для вычислений которые занимают слишком много cpu time блокируя loop
Сережа
я и ваш го заблокирую легко, есть вроде бы GOMAXPROC - это сколько потоков отрабатывают горутины
Сережа
достаточно сделать такое количество горутин с бесконечным циклом и все
Aleksand
я и ваш го заблокирую легко, есть вроде бы GOMAXPROC - это сколько потоков отрабатывают горутины
ну покажи как заблокируешь, шедулер же распланирует на доступный ресурс CPU, загрузить на 100% != заблокировать же
Сережа
вроде бы переход с горутины происходит только в определенные моменты
Сережа
при блокирующих вызовах или runtime.Gosched()
Roman
достаточно сделать такое количество горутин с бесконечным циклом и все
однако scheduler будет переодически свитчить между тасками, один таск не заблокирует другой
Roman
так-что аргумент не точен
Roman
так-что Go заблокировать намнооого сложнее чем Node
Сережа
не будет, если будет go func() { for {} }() * GOMAXPROC раз
Roman
ты уверен?
Daniel
да, так и есть
Roman
у меня по этому поводу инфы нет, поэтому интересно откуда она у тебя
Сережа
сейчас проверю
Сережа
вообще это из теории, после прочтения Кернигана про го
Сережа
если так и есть то не буду проверять
Daniel
шедулер дедлает переключение на io not inlined func call
Roman
а это проверить же легко
Daniel
я ровно один раз с этим столкнулся
Roman
просто 2 goroutine'ы запустить с разным console output'ом и обе подвесить в бесконечном цикле
Roman
если логировать выводить будет только один - всё ясно
Сережа
по умолчанию GOMAXPROC = кол-ву ядер
Сережа
я не до конца понял, что ты хочешь сделать, но похоже что это не заблокируется
Roman
тут скорее вопрос может ли go scheduler как системный scheduler переключать переодически рутины