
Roman
04.07.2017
09:45:37
новички любят синхронный код код блокируя этим event loop, это катастрофа

Серж
04.07.2017
09:45:43
callback hell?

Daniel
04.07.2017
09:45:53
он, родимый
вернее, нет

Google

Ivan
04.07.2017
09:46:11
callback hell уже сто лет не актуален

Серж
04.07.2017
09:46:14
это другая проблема

Daniel
04.07.2017
09:46:15
это вторая проблема, из которой проистекает первая

Серж
04.07.2017
09:46:17
но она стоит острее
по крайней мере на си и плюсах
на древних компиляторах

Roman
04.07.2017
09:47:06
против callback hell есть инструменты например Promises, на данный момент разрабатываю библиотеку асинхронного программирования для Qt: https://qbeon.github.io/QuickStreams/

Ivan
04.07.2017
09:47:49
уже столько сахара накрутили и паттернов, что коллбэк хэла уже давно нет

Roman
04.07.2017
09:47:49
там ещё более продвинутый подход.. asynchronous programming in streams

Серж
04.07.2017
09:47:57
в кутэ же система событий во фреймворке, зачем там асинхронная библиотека?

Ivan
04.07.2017
09:48:09
промизы/асинк эвэйт/реактивное программирование

Серж
04.07.2017
09:48:13
это как в джава9? ленивые стримы?

Roman
04.07.2017
09:48:23

Google

Roman
04.07.2017
09:48:53
промизы/асинк эвэйт/реактивное программирование
верно, в QuickStreams я пошёл чуток дальше и добавил в reactive programming стримы
стримы можно представить себе как Promise'ы на стеройдах (abortable, pausable, resumable, attachable, nested abstractions)
однако в Go такие подходы не нужны ибо тут green threads отменяют нужды в асинхронном коде
но поскольку в Go важно понимание синхронизации (multithreaded programming) походу выходит что event loop новичкам и разработчикам более высокого уровня на самом деле будет легче

Daniel
04.07.2017
09:55:48
на самом деле - седые строгие отцы не зря продвигают каналы для межгорутинного общения
канал довольно удачно прячет синхронизацию внутри

Michael
04.07.2017
09:56:12
+1

Daniel
04.07.2017
09:56:32
удачно с точки зрения абстракции. с точки зрения производительности каналы так себе решение

Roman
04.07.2017
09:56:49
в то время как race conditions и т.д. дебажить относительно сложно да и само по себе multithreaded программирование тема не из простых - асинхронное программирование легче дебажить и если блокировать loop то это заметно снижает производительность

Aleksandr
04.07.2017
09:57:50

Roman
04.07.2017
09:58:02
поэтому код в эвент лупе нужно писать в асинхронном стиле (callbacks / promises & futures / streams / reactive)

Daniel
04.07.2017
10:05:33

Mush
04.07.2017
10:05:46
да

Roman
04.07.2017
10:06:27

Aleksandr
04.07.2017
10:06:57

Daniel
04.07.2017
10:07:08
интересно, что java начинала с синхронизированных структур, но уже в 1.2 появились несинхронизированные версии - слишком велики были performance penalty
а go зашел с другой стороны, но все равно без двух версий не обошлось

Roman
04.07.2017
10:08:13

Google

Aleksandr
04.07.2017
10:09:03

Roman
04.07.2017
10:10:11

Aleksandr
04.07.2017
10:10:18
в питоне eventloop заблокировать можно, в nodejs нельзя, если не использовать специально созданные ружья для выстрела в ногу)

Daniel
04.07.2017
10:10:29

Aleksandr
04.07.2017
10:10:47

Roman
04.07.2017
10:11:06

Aleksandr
04.07.2017
10:11:28
и если eventloop пулит такие задачи по тредам то все ок будет

Daniel
04.07.2017
10:11:40
eventloop перепендикулярен тредам, можно ввод-вывод сделать на эвентлупе, а колбеки на тредах
собственно java nio

Aleksandr
04.07.2017
10:12:09
уровень доступа к eventloop в ноде нулевой, ты этой абстракцией не управляешь, а в питоне управляешь напрямую

Roman
04.07.2017
10:13:12
оно заблокирует не evetloop а нить
возможно ты неправильно понял, речь идёт об использовании той или иной технологии с точки зрения программиста пользователя
если написать в бизнес логике вычисление числа фибоначчи до уровня 10^999 то event loop повиснет, ибо бизнес логика выполняется не в нитях async IO, а в main thread'e
и этого к сожалению многие особенно в начале не понимают и блокируют тем самым луп значитльно снижая производительность процесса

Roman
04.07.2017
10:14:00
на thread pool'е выполняется код к которому ты как пользователь в основном не имеешь доступа, это реализация того или иного API

Aleksandr
04.07.2017
10:14:09

Roman
04.07.2017
10:14:12
например filesystem API, network API и т.д. и т.п.

Серж
04.07.2017
10:14:20
конкретно в ноде и в libuv есть пул потоков

Aleksandr
04.07.2017
10:14:57
он там свою сомнительную магию делает

Серж
04.07.2017
10:15:34
все блокируемые вызовы нода наверное выполняет в потоке из пула
операции с файлами и т.д.

Google

Roman
04.07.2017
10:16:09
конечно же у event loop'а есть thread pool для параллельного исполнения нескольких задач одновременно.. но речь идёт о БИЗНЕС ЛОГИКЕ

Aleksandr
04.07.2017
10:16:12

Roman
04.07.2017
10:16:27
если бизнес логика написана в синхронном стиле то это для event loop'а катастрофа
вот что собственно имеется ввиду

Aleksandr
04.07.2017
10:16:59

Анатолий
04.07.2017
10:17:29
заглушек нет, дети целы
да и вообще аналогия - сомнительный приём
хорошо что в го не эвентлуп с коллбеками

Roman
04.07.2017
10:18:40
хороший специалист блокирующий код писать не будет, но их к сожалению не так много на самом деле потому-что сама идея асинх. прогр. пока ещё довольно нова в мейнстриме

Анатолий
04.07.2017
10:18:41
расходимся

Admin
ERROR: S client not available

Aleksandr
04.07.2017
10:18:48
вот что собственно имеется ввиду
ну конкретно в ноде можно линтить вызов sync-методов и не давать их использовать, в питоне не давать работать с eventloop напрямую в продукте реализующим бизнес, писать асбтракции исключающие это

Roman
04.07.2017
10:20:02

Серж
04.07.2017
10:20:09
я и ваш го заблокирую легко, есть вроде бы GOMAXPROC - это сколько потоков отрабатывают горутины
достаточно сделать такое количество горутин с бесконечным циклом и все

Aleksandr
04.07.2017
10:21:13

Серж
04.07.2017
10:21:42
вроде бы переход с горутины происходит только в определенные моменты
при блокирующих вызовах или runtime.Gosched()

Roman
04.07.2017
10:22:08
так-что аргумент не точен

Google

Aleksandr
04.07.2017
10:22:34

Roman
04.07.2017
10:22:57
так-что Go заблокировать намнооого сложнее чем Node

Серж
04.07.2017
10:23:01
не будет, если будет
go func() { for {} }()
* GOMAXPROC раз

Roman
04.07.2017
10:23:23
ты уверен?

Daniel
04.07.2017
10:23:41
да, так и есть

Roman
04.07.2017
10:23:42
у меня по этому поводу инфы нет, поэтому интересно откуда она у тебя

Серж
04.07.2017
10:23:44
сейчас проверю
вообще это из теории, после прочтения Кернигана про го
если так и есть то не буду проверять

Daniel
04.07.2017
10:24:20
шедулер дедлает переключение на
io
not inlined func call

Roman
04.07.2017
10:24:24
а это проверить же легко

Daniel
04.07.2017
10:24:43
я ровно один раз с этим столкнулся

Roman
04.07.2017
10:25:12
просто 2 goroutine'ы запустить с разным console output'ом и обе подвесить в бесконечном цикле
если логировать выводить будет только один - всё ясно

Andrew
04.07.2017
10:25:39

Серж
04.07.2017
10:25:48
по умолчанию GOMAXPROC = кол-ву ядер
я не до конца понял, что ты хочешь сделать, но похоже что это не заблокируется

Roman
04.07.2017
10:26:37
тут скорее вопрос может ли go scheduler как системный scheduler переключать переодически рутины

Серж
04.07.2017
10:26:46
если у тебя одноядерный процессор то заблокируется

Roman
04.07.2017
10:27:03
если GOMAXPROC поставить на 1

Серж
04.07.2017
10:27:04
не может и это вроде как киллерфича, меньше синхронизаций нужно

Roman
04.07.2017
10:27:09
for testing purposes only

Серж
04.07.2017
10:27:31
т.е. у тебя есть гарантия что переключение горутины будет происходить в определенные моменты