@kotlin_lang

Страница 714 из 982
Тимур
19.06.2018
10:37:58
мне казалось, что котлиновские корутины - просто сахар над колбеками
квазар и котлиновские корутины - это конкурирующие технологии, которые по сути делают одно и тоже, просто разными способами

1337
19.06.2018
10:42:12
реактор тоже?

Google
Mikhail
19.06.2018
11:24:32
Тимур
19.06.2018
11:30:11
так котлиновские корутины мне помогут инструментировать InputStream или нет?
инструментировать стандартный InputStream - нет но можно сделать асинхронный аналог InputStream и использовать его

Mikhail
19.06.2018
11:30:45
асинхронный я и так могу сделать на колбеках

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

Тимур
19.06.2018
11:31:48
асинхронный я и так могу сделать на колбеках
можно, только это будет коряво

Mikhail
19.06.2018
11:32:53
меня сейчас больше интересует производительность, чем красота

Vladimir
19.06.2018
11:33:08
так котлиновские корутины мне помогут инструментировать InputStream или нет?
Нет. Котлиновские корутины работают через котлиновский компилятор

Quantum Harmonizer
19.06.2018
11:35:21
мне нужно свой кастомный инпутстрим прокинуть в библиотеку, которая будет его юзать как обычный блокирующий
Кажется, нет: чтобы засуспендить выполнение функции, сгенерированный байт-код возвращает специальный объект, который все функции выше по стеку должны вернуть.

Mikhail
19.06.2018
11:36:12
файберы кажется могут такое устроить

Quantum Harmonizer
19.06.2018
11:36:18
Нет адекватного способа вызвать suspend-функцию из не-suspend-функции, потому что последняя не умеет ни возвращать флаг суспенда, ни продолжать выполнение с произвольного места.

Vladimir
19.06.2018
11:37:16
файберы кажется могут такое устроить
Файберы в Quasar вряд ли могут проинструментировать класс JDK

Mikhail
19.06.2018
11:39:53
короче проще бросить всю затею с магией зеленых потоков

Тимур
19.06.2018
11:47:08
мне нужно свой кастомный инпутстрим прокинуть в библиотеку, которая будет его юзать как обычный блокирующий
тут корутины не помогут они рассчитаны на котлиновский код, хакать существующие java библиотеки они не будут

Google
Quantum Harmonizer
19.06.2018
12:03:03
может, форкнуть библиотеку и убрать из неё всю некрофилию с InputStream?

https://github.com/andrewoma/coroutine-jdbc

Mikhail
19.06.2018
12:10:03
xnio?
там есть что-то похожее?

https://github.com/andrewoma/coroutine-jdbc
но jdbc же блокирующее, как оно будет работать?

Quantum Harmonizer
19.06.2018
12:11:19
но jdbc же блокирующее, как оно будет работать?
создаст стопицот потоков и заблокирует их, а твой event loop будет свободен

Alexey
19.06.2018
12:12:03
И сожрёт 100500 * Xss оффхипа

Mikhail
19.06.2018
12:12:53
создаст стопицот потоков и заблокирует их, а твой event loop будет свободен
так я свой тредпул могу юзать с блокирующим io, я хочу чтобы не блокировалось, чтобы потоков всего было по количеству ядер и никакого переключения контекста

Mikhail
19.06.2018
12:21:43
postgres

Alexey
19.06.2018
12:21:57
Для постгри и мускуля вроде написаны асинхронные драва на nio

Mikhail
19.06.2018
12:22:27
Там же всё грозятся сделать асинхронный api в jdbc
а будет апи, чтобы свою имплементацию nio прикрутить?

Alexey
19.06.2018
12:22:49
Вот что то есть на джавке https://github.com/alaisi/postgres-async-driver

Mikhail
19.06.2018
12:23:17
у вертекса есть шустренький драйвер постгреса

вот если там нетворк подменить на свой, то все будет зашибись

я не вижу особого смысла в асинхронности, если она выполняется в другом потоке

Google
Mikhail
19.06.2018
12:25:06
так же можно просто отдельный тред создать и юзать блокирующие вызовы

Alexey
19.06.2018
12:26:24
Ну по ресурсам это совсем не одно и тоже

Как ты собираешься в асинхронщины без смены потоков?

Mikhail
19.06.2018
12:28:40
Alexey
19.06.2018
12:29:04
м.. на колбеках, не вижу проблем
А это не смена потока?

Mikhail
19.06.2018
12:29:20
не обязательно

Наиль
19.06.2018
12:34:12
вот этот клиент немного щупал. корни уходят в vertx , nio https://github.com/reactiverse/reactive-pg-client Сама обертка вроде не создает потоки

Mikhail
19.06.2018
12:34:49
А это не смена потока?
у меня есть nio, которое кидает эвенты на возможность чтения/записи в сокет, пришел реквест, я это прочитал, понял, что нужно сходить в базу, создал коннект в том же nio, кинул туда sql запрос, повесил колбек на ответ, ушел ждать эвентов в nio, получил эвент на чтение из базы, прочитал ответ, выполнил колбек и срендерил ответ, записал его в сокет изначального реквеста. Все в одном потоке

проблема только в блокирующем io на jdbc

Наиль
19.06.2018
12:35:47
а что с ней не так?

Mikhail
19.06.2018
12:36:38
ну если юзать ее без вертекса, то получается смена потока и никакого выйгрыша по производительности нет

у меня даже апдейты не работали, только чтение

Наиль
19.06.2018
12:37:37
там nio, поддерживает unix domain sockets если postgres и app на одной машине

Mikhail
19.06.2018
12:40:40
Это хорошо, но это довольно редкая ситуация, обычно база отдельно от приложения

Наиль
19.06.2018
12:41:25
даже если отдельно то там nio как ни крути

Quantum Harmonizer
19.06.2018
12:41:42
не излишне ли вообще поднимать СУБД в отдельном процессе, если всё на одной машине?

Mikhail
19.06.2018
12:43:21
даже если отдельно то там nio как ни крути
У меня свой nio, писать запрос в другой nio - все равно что юзать блокирующий io

Наиль
19.06.2018
12:45:02
либа не создает потоки. Правда со всеми этими асинхронными драйверами (эта либа не единственная) я только не понимаю как в конечном итоге идет взаимодействие с postgres. postgres построен на процессах и shared memory, каждое соединение - это процесс. если вы создаете пул соединений к бд - то это пул процессов. в каждом процессе своя нить. Даже если в нашем приложении 1 поток, то в итоге все равно же будет переключение контекста

Google
Vladimir
19.06.2018
12:46:35
А большой ли вообще смысл в асинхронном IO с СУБД, если сама СУБД может выполнять параллельно весьма ограниченное количество запросов?

Mikhail
19.06.2018
12:47:14
не понимаю, можете разжевать?
У меня своя обёртка над линуксовым epoll, которая имплементит неблокирующее io

Наиль
19.06.2018
12:47:59
У меня своя обёртка над линуксовым epoll, которая имплементит неблокирующее io
Я в этом вопросе могу плавать, так как не делал, но вроде как этой библиотеке можно скормить эту обертку, чтобы она через нее ходила

Vladimir
19.06.2018
12:49:33
postgres вполне неплохо параллелится на многоядерных системах
Но ведь каждое соединение всё равно дорогое? По сравнению с этим держать в приложении заблокированный поток на это соединение не видится таким большим злом.

dimiii
19.06.2018
12:52:15
Наиль
19.06.2018
13:06:38
поправьте, если ошибаюсь, это то как я понимаю: В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы. Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие, то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также. Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена. Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста. Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней. Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.

Quantum Harmonizer
19.06.2018
13:07:59
поправьте, если ошибаюсь, это то как я понимаю: В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы. Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие, то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также. Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена. Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста. Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней. Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.
> синхронное io все равно производительней эмм, это где так и почему?

Наиль
19.06.2018
13:13:34
статьи были где сравнивалось nio и io. суть была в том, что io проценотов на 15 - 20 производительней. Сейчас поищу

Quantum Harmonizer
19.06.2018
13:15:46
nio 1 из 1.4 или 2 из 1.7?

Наиль
19.06.2018
13:19:05
вроде сравнивали последние версии. и к слову, речь шла именно не о кейсе, когда сотни тысяч клиентов маленькие реквесты шлют и ждут - это как раз кейс для nio а пересылка больших обьемов данных была.

Вообще, эта тема вроде как холиварная) из-за непонимания акцента, на котором делают бенчмарк те или иные тестеры. Ведь как это свеженький nio может быть медленней древнего io? )) (ссылку все еще ищу)

1337
19.06.2018
13:22:18
в io без бутылки не разобраться

так сходу и не напишешь банальное считывание строк с файла

Vladimir
19.06.2018
13:23:03
Наиль
19.06.2018
13:23:03
поправьте, если ошибаюсь, это то как я понимаю: В чем отличие jdbc от асинхронных драйверов в разрезе обсуждаемой темы. Если у вас app написан в блокирующем стиле, блокирующее io, например спринг и другие, то у вас поток на коннекшен есть, потом таска шедулится в поток пула, потом шедулится в процесс постгры. и обратно ответ идет также. Если у вас app написан в асинхронном стиле, технологии базирующиеся на nio - netty / jetty и прочие, соответственно тот же spring 5 webflux или KTOR, то минус поток на обработку коннекшена. Если и пул потоков будет асинхронным как в этой библиотеке, то еще минус 1 переключение контекста. Вот есть ли выигрыш в переключениях контекста, я не уверен. Так как синхронное io все равно производительней. Поэтому мне кажется, что решение использовать jdbc в пуле потоков или использовать асинхронные драйвера не будет базироваться на производительности из-за отсутствия переключения контекстов - скорее всего это не играет роли. Но например при использовании ktor c корутинами очень удобно было асинхронное API завернуть в suspend функцию. Это можно сделать и с синхронным jdbc + пул потоков.
кроме nio vs io других отклонений от общего понимания как все работает нет?

Mikhail
19.06.2018
13:31:27
nio 1 из 1.4 или 2 из 1.7?
дефолтный nio в жаве вообще не очень, насколько я помню, он не умеет в многопоточность

Наиль
19.06.2018
13:41:11
не нашел ссылку что-то. Но суть была в том, что сложность nio, которая открывает новые возможности, оборачивается ей шудшей производительностью, в отличие от кондового и простого механизма блокирующего io. Но ладно, эта тема не точная, какие-то отголоски этих мыслей только глубоко на форумах можно найти. Для кейса когда вебсервер обслуживает много клиентов nio - это лучшее решение.

Alexey
19.06.2018
13:43:14
Это было конкретно про потоковое чтение

Что если у тебя есть готовый стрим, то его быстрее вычитать через io чем через колбеки с nio

Google
Alexey
19.06.2018
13:54:33
Быстрее в плане по времени исполнения

Mikhail
19.06.2018
13:57:08
реквестирую бенчмарки

Vhäldemar
19.06.2018
13:58:43
https://github.com/romromov/java-io-benchmark

Mikhail
19.06.2018
14:16:39
ну и, nio быстрее на буфере в 8кб, но медленнее на буфере в 1кб

серьезно, 1кб буфера? я меньше 16 нигде не юзаю

Vhäldemar
19.06.2018
14:18:20
без "ну и"

просто результат

Alexander
19.06.2018
15:43:58
Там вся разница в буферизации и в том, сколько раз память дергается. nio тратить больше времени на один дерг, но при этом меньше на выкачивание большого буфера, так как он в общем случае аллоцируется вне кучи. Поэтому nio выигрывает на больших блоках данных, а io показывает лучшие результаты на коротких сообщениях.

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