@kotlin_lang

Страница 501 из 982
Bogdan
21.01.2018
22:21:50
корунтины решают проблему, потоки -нет

корунтины меньше стоят чем потоки

код с корунтинами, может (подчеркиваю!) выглядеть красивей\читабелней чем с потоками

Georgiy
21.01.2018
22:23:03
before/after action — оборачивает все методы контроллера сразу — позволяет ли вообще пропустить выполнение экшена? — позволяет ли подменить результат экшена?
В приведенном выше примере декоратор так же обернет только метод, возвращающий коллекцию других методов. Да, можно таким образом подменить результат экшна (выбрать нужную функцию и декорировать ее), можно отменить выполнение (подменив на пустую функцию), но тут уже серьезной логикой в роутере попахивает :) Вариант без наследования контроллера и именованных методов-экшнов выглядит и правда более гибким, однако стандартный подход с MVC обеспечивает более понятный (документированный, предсказуемый) workflow приложения для новых разработчиков.

Google
Georgiy
21.01.2018
22:25:26
before/after action — оборачивает все методы контроллера сразу — позволяет ли вообще пропустить выполнение экшена? — позволяет ли подменить результат экшена?
Я думаю, можно закончить обсуждение, спасибо) Я понял слабые стороны контроллера в MVC, согласен с аргументами

Anton
21.01.2018
22:27:26
каким образом корутины проблемы синхронизации решают?

Quantum Harmonizer
21.01.2018
22:27:46
А можно поподробнее свое видение?
Ну, допустим Router( Route(URL, func), ... )

Artem
21.01.2018
22:28:03
ну вроде на смену MVC приходит mvvm
Что-то на смену чему-то в этом плане вряд ли когда-то прийдёт. Каждый будет использовать то, что может/умеет/удобнее/лучше

Quantum Harmonizer
21.01.2018
22:28:32
каким образом корутины проблемы синхронизации решают?
В каналах и акторах есть неблокирующие очереди, например.

Anton
21.01.2018
22:28:50
блокингкью есть и без них

Quantum Harmonizer
21.01.2018
22:29:20
блокингкью есть и без них
Очередь Елизарова должна быть быстрее

Google
Anton
21.01.2018
22:29:22
чувак говорит что рейскондишен решается корутинами если я правильн понял)

Андрей
21.01.2018
22:29:33
если ты можешь запустить потоки, которые полностю не зависимые друг от друга, то это выглядить странно
Да можно много разных фоновых задач придумать, которые будут работать в своих потоках, не завися от других. С тем же GUI в джаве уже давно работают, фоновые процессы на другие потоки переносят, результат работы в GUI поток возвращают, и все это не блокирая сам GUI поток. Примеры можно понаходить для разных GUI API, таких как awt, swt, JavaFX, Android.

Anton
21.01.2018
22:29:45
а разве там под капотом не джавовская блокингкью?

Quantum Harmonizer
21.01.2018
22:30:39
Anton
21.01.2018
22:30:58
а я почему то так думал(

Georgiy
21.01.2018
22:31:41
Ну, допустим Router( Route(URL, func), ... )
Практически так, я представлял еще более упрощенно, не как коллекцию объектов Route, а как коллекцию пар ключ-значение (что не принципиально)

Andrew
21.01.2018
22:32:30
На всякий случай -- в случае с UI тяжеловесные действия всё равно должны выполняться в фоновом потоке, потому у вас всё равно корутины будут раскиданы по разным потокам. Стоит таки повникать детальнее в то, о чём они и как они соотносятся с потоками.

я описал конкретную ситуацию с GUI

корунтины решают проблему, потоки -нет

Ivan
21.01.2018
22:34:15
ребят, можно тупой немного вопрос: есть в gradle-kotlin dsl вот такой сеттер public void setApplicationDefaultJvmArgs(Iterable<String> applicationDefaultJvmArgs) { this.applicationDefaultJvmArgs = applicationDefaultJvmArgs; } вот так applicationDefaultJvmArgs = [""] говорит не правильно, а как?

Andrew
21.01.2018
22:35:04
Спасибо, я их смотрел. Корутины не дешевле потоков, когда гарантированно придётся использовать разные потоки. Но всё ещё удобнее, само собой.

Ivan
21.01.2018
22:35:24
причём всякие kotlin.collections.arrayListOf() - а) не доступен и б) ну как-то не очень смотрится

Google
Ivan
21.01.2018
22:36:25
создать 2 потока и создать 2 корутины - это вообще как небо и земля

Bogdan
21.01.2018
22:36:38
arrayListOf<String> ()

Ivan
21.01.2018
22:37:17
arrayListOf<String> ()
так я же написал, не доступен сам метод, пакет kotlin.collections в гредл не прокидывается

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

Bogdan
21.01.2018
22:38:56
ну и в целом что-то подсказывает что должен быть другой способ
ну сихнатура метода указывает что принимается итератор, зачастую это масивы\колекции

Array

пробуй

Ivan
21.01.2018
22:39:43
не, тоже красный

Andrew
21.01.2018
22:39:53
Правильно. Ещё раз -- у нас есть UI-поток, который нельзя надолго блокировать, и есть сложная на процессор операция / синхронный ввод-вывод. сделать это асинхронно на одном потоке у вас не получится, вам в любом случае нужно поднимать фоновый поток из пула. а поверх него разворачивать корутины и синхронизировать её с корутиной в основном потоке. Что именно у вас здесь дешевле выходит?

Bogdan
21.01.2018
22:40:02
не, тоже красный
он может быть красным, пробуй собрать

Ivan
21.01.2018
22:41:08
он может быть красным, пробуй собрать
build.gradle.kts:17:40: Unresolved reference: Array

Andrew
21.01.2018
22:42:56
есть спецалный билдер async
Я в курсе. Он какое отношение к вопросу имеет?

Andrew
21.01.2018
22:44:26
Ровно об этом я и говорю -- при надобности уйти из UI в бекграунд корутины волшебным образом не делают всё дешевле.

Bogdan
21.01.2018
22:44:43
Я в курсе. Он какое отношение к вопросу имеет?
вы думае что запущеные корунтины обязаны выполнятся на одном потоки - это не так

Google
Bogdan
21.01.2018
22:45:12
я чесно не поню утверждать не буду но примерно так, еще своя память выеляется

Andrew
21.01.2018
22:46:55
вы издеваетесь? 2-4 мг это только стек для потока
Я понять не могу -- у вас есть две корутины, которые выполняются на двух разных потоках -- одна в UI, вторая в CommonPool -- у вас и между ними переключение бесплатное просто потому, что они корутины?

Ivan
21.01.2018
22:46:58
Ровно об этом я и говорю -- при надобности уйти из UI в бекграунд корутины волшебным образом не делают всё дешевле.
не, волшебным образом дешевле не сделают, если у вас все вызовы только блокирующее IO, но это же вряд ли так. Если нет, то можно выделить в отдельный пулл всё блокирующее, с которыми ничего не сделаешь, отвести под них пулл, а остальное удешевлять уже

Bogdan
21.01.2018
22:47:13
корунтина это блок кода который может выполнен на любом потоке. Им без разницы

Ivan
21.01.2018
22:48:43
я бы просто понял если была бы 1 корутина и 2 потока

или наоборот

но в целом да, переключение там фигня же, как засабмитить таску в Excecuter

Ivan
21.01.2018
22:51:20
а дальше что-то вроде "товарищ Executer продолжи вот этот блок кода с такой-то чиселки, а там блок кода - это свитч от этого числа"

Andrew
21.01.2018
22:51:47
Так, давайте ещё раз -- Богдан отметил, что корутины лучше и дешевле, чем потоки, я отметил, что в случае с необходимостью выполнить блокирующую операцию всё равно будет CommonPool и затраты на переключение потоков, потому волшебства нету и нету безусловного "дешевле". О чём спор, раз тут все такие умные, что сарказмом разбрасываются?

Andrew
21.01.2018
22:53:38
Не обязательно, конечно. Всё ещё другой поток, откуда он возьмётся -- CommonPool, свой экзекьютор -- не важно.

Google
Andrew
21.01.2018
22:54:21
это не нативное переключения потоков, но да когда у вас тормозит память или диск а процесор ждет он будет ждать в любом случае
Почему не нативное? Я вот и пытаюсь понять, куда девается нативное переключение потоков, когда есть несколько потоков.

Ivan
21.01.2018
22:54:34
и про затраты на перелючение - тут всё-равно не понял, вызывается блокирующий метод, блокирует поток, в пулле -1, как только закончил продолжил выполнять следующий код в том же потоке

вот для этого и существуют програмисты
чтобы потоки из воздуха делать? =)

Andrew
21.01.2018
22:57:39
ну скажем там есть куча фигни в процессоре, ванги манги
Хорошо, я попробую поставить иначе вопрос, а то ну совсем никак не получается диалог -- вы о чём-то своём. Чем async(CommonPool) { ... } .await() дешевле, чем фьючеры с экзекьютором?

Ivan
21.01.2018
22:58:54
Почему не нативное? Я вот и пытаюсь понять, куда девается нативное переключение потоков, когда есть несколько потоков.
стоп, ну тут оба правы же, до suspend point всё выполняет один поток, как только начали чего-то ждать асинхронно - тут тред вернули в пулл, потом когда дождались взяли из пула тред, каким он будет - хз

Bogdan
21.01.2018
22:58:59
псали же конечный автомат

я пока в коде не ковырялся

но да если слишком много корунтин, даже которые ничего не блочат

Ivan
21.01.2018
23:00:47
комон пул это не один поток, реализацию нужно смотреть
омг, где я написал что пулл - это один поток?

Bogdan
21.01.2018
23:00:52
это может замедить

сорян

Страница 501 из 982