@gogolang

Страница 354 из 1630
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
это как в джава9? ленивые стримы?
не знаком с Java stream'ами, однако часто слышу

промизы/асинк эвэйт/реактивное программирование
верно, в 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 то это заметно снижает производительность

Roman
04.07.2017
09:58:02
удачно с точки зрения абстракции. с точки зрения производительности каналы так себе решение
не спорю, однако это не меняет факт что channel это в конце концов тоже лишь mutex конструкция и рано или поздно чел встретится с проблемами синхронизации, например когда 2 рутины обрабатывают один map

а как заблокировать eventloop? про какой язык речь тут?
да очень просто, язык тут абсолютно не при чём, суть в том, что вся бизнес логика выполняется в одном потоке, если писать блокирующий код то это будет существенно тормозить процесс

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

Mush
04.07.2017
10:05:46
да

Roman
04.07.2017
10:06:27
в 1.9 появился синхронизированный map, все видели?
ну окей, тем не менее так или иначе в некоторых случаях синхронизировать код надо ручками, в event loop'е такой потребности нет в принципе

Aleksandr
04.07.2017
10:06:57
да очень просто, язык тут абсолютно не при чём, суть в том, что вся бизнес логика выполняется в одном потоке, если писать блокирующий код то это будет существенно тормозить процесс
при чем, не в каждом дают такую возможность - блокировать eventloop и вообще управлять им, но в целом по сути сказанного спорить не о чем

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

а go зашел с другой стороны, но все равно без двух версий не обошлось

Roman
04.07.2017
10:08:13
при чем, не в каждом дают такую возможность - блокировать eventloop и вообще управлять им, но в целом по сути сказанного спорить не о чем
что значит "дают возможность"... тут же всё элементарно: если мы пишем слишком много кода для выполнения в одном цикле event loop'а - мы его неизбежно блокируем..

Google
Roman
04.07.2017
10:10:11
без конкретной реализации eventloop это разговор безадресный
по вашему event loop можно написать таким образом, что вычисление числа фибоначчи до хрендевятисятой степени не сможет его заблокировать?))

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

Roman
04.07.2017
10:11:06
в питоне eventloop заблокировать можно, в nodejs нельзя, если не использовать специально созданные ружья для выстрела в ногу)
нельзя?! это как?)))) как-раз таки в Node это проблема очень частая особенно для новичков

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

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
операции с файлами и т.д.
да, libuv через тредпул

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

вот что собственно имеется ввиду

Aleksandr
04.07.2017
10:16:59
если бизнес логика написана в синхронном стиле то это для event loop'а катастрофа
если ребенка подпустить к розетке тоже будет трагедия, надо втыкать заглушки туда

Анатолий
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
ну конкретно в ноде можно линтить вызов sync-методов и не давать их использовать, в питоне не давать работать с eventloop напрямую в продукте реализующим бизнес, писать асбтракции исключающие это
использование sync методов это лишь одна из возможностей блокировки которая на самом деле не так часта как другие, порой особенно в Node javascript используется для вычислений которые занимают слишком много cpu time блокируя loop

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

достаточно сделать такое количество горутин с бесконечным циклом и все

Aleksandr
04.07.2017
10:21:13
я и ваш го заблокирую легко, есть вроде бы GOMAXPROC - это сколько потоков отрабатывают горутины
ну покажи как заблокируешь, шедулер же распланирует на доступный ресурс CPU, загрузить на 100% != заблокировать же

Серж
04.07.2017
10:21:42
вроде бы переход с горутины происходит только в определенные моменты

при блокирующих вызовах или runtime.Gosched()

Roman
04.07.2017
10:22:08
достаточно сделать такое количество горутин с бесконечным циклом и все
однако scheduler будет переодически свитчить между тасками, один таск не заблокирует другой

так-что аргумент не точен

Google
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'ом и обе подвесить в бесконечном цикле

если логировать выводить будет только один - всё ясно

Серж
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
т.е. у тебя есть гарантия что переключение горутины будет происходить в определенные моменты

Страница 354 из 1630