Vanya
промизы/асинк эвэйт/реактивное программирование
Сережа
это как в джава9? ленивые стримы?
Roman
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 то это заметно снижает производительность
Aleksand
Roman
поэтому код в эвент лупе нужно писать в асинхронном стиле (callbacks / promises & futures / streams / reactive)
Daniel
Anonymous
да
Aleksand
Daniel
интересно, что java начинала с синхронизированных структур, но уже в 1.2 появились несинхронизированные версии - слишком велики были performance penalty
Daniel
а go зашел с другой стороны, но все равно без двух версий не обошлось
Aleksand
Aleksand
в питоне eventloop заблокировать можно, в nodejs нельзя, если не использовать специально созданные ружья для выстрела в ногу)
Daniel
Aleksand
Roman
Aleksand
и если eventloop пулит такие задачи по тредам то все ок будет
Daniel
eventloop перепендикулярен тредам, можно ввод-вывод сделать на эвентлупе, а колбеки на тредах
Daniel
собственно java nio
Aleksand
Aleksand
уровень доступа к eventloop в ноде нулевой, ты этой абстракцией не управляешь, а в питоне управляешь напрямую
Roman
оно заблокирует не evetloop а нить
возможно ты неправильно понял, речь идёт об использовании той или иной технологии с точки зрения программиста пользователя
если написать в бизнес логике вычисление числа фибоначчи до уровня 10^999 то event loop повиснет, ибо бизнес логика выполняется не в нитях async IO, а в main thread'e
и этого к сожалению многие особенно в начале не понимают и блокируют тем самым луп значитльно снижая производительность процесса
Roman
на thread pool'е выполняется код к которому ты как пользователь в основном не имеешь доступа, это реализация того или иного API
Aleksand
Roman
например filesystem API, network API и т.д. и т.п.
Сережа
конкретно в ноде и в libuv есть пул потоков
Aleksand
Aleksand
он там свою сомнительную магию делает
Сережа
все блокируемые вызовы нода наверное выполняет в потоке из пула
Сережа
операции с файлами и т.д.
Roman
конечно же у event loop'а есть thread pool для параллельного исполнения нескольких задач одновременно.. но речь идёт о БИЗНЕС ЛОГИКЕ
Aleksand
Roman
если бизнес логика написана в синхронном стиле то это для event loop'а катастрофа
Roman
вот что собственно имеется ввиду
Aleksand
Anatoly
заглушек нет, дети целы
Anatoly
да и вообще аналогия - сомнительный приём
Anatoly
хорошо что в го не эвентлуп с коллбеками
Roman
хороший специалист блокирующий код писать не будет, но их к сожалению не так много на самом деле потому-что сама идея асинх. прогр. пока ещё довольно нова в мейнстриме
Anatoly
расходимся
Aleksand
вот что собственно имеется ввиду
ну конкретно в ноде можно линтить вызов sync-методов и не давать их использовать, в питоне не давать работать с eventloop напрямую в продукте реализующим бизнес, писать асбтракции исключающие это
Сережа
я и ваш го заблокирую легко, есть вроде бы GOMAXPROC - это сколько потоков отрабатывают горутины
Сережа
достаточно сделать такое количество горутин с бесконечным циклом и все
Сережа
вроде бы переход с горутины происходит только в определенные моменты
Сережа
при блокирующих вызовах или runtime.Gosched()
Roman
так-что аргумент не точен
Aleksand
Roman
так-что Go заблокировать намнооого сложнее чем Node
Сережа
не будет, если будет
go func() { for {} }()
* GOMAXPROC раз
Roman
ты уверен?
Daniel
да, так и есть
Roman
у меня по этому поводу инфы нет, поэтому интересно откуда она у тебя
Сережа
сейчас проверю
Сережа
вообще это из теории, после прочтения Кернигана про го
Сережа
если так и есть то не буду проверять
Daniel
шедулер дедлает переключение на
io
not inlined func call
Roman
а это проверить же легко
Daniel
я ровно один раз с этим столкнулся
Roman
просто 2 goroutine'ы запустить с разным console output'ом и обе подвесить в бесконечном цикле
Roman
если логировать выводить будет только один - всё ясно
Anonymous
Сережа
по умолчанию GOMAXPROC = кол-ву ядер
Сережа
я не до конца понял, что ты хочешь сделать, но похоже что это не заблокируется
Roman
тут скорее вопрос может ли go scheduler как системный scheduler переключать переодически рутины