Size: a a a

2019 November 09

Ⓢⓔⓡⓖ in Kotlin Moscow
Конкретно сейчас решаем задачу: 1) есть экспериментальный реактивный драйвер для Postgres 2) есть обёртка для него для построения и выполнения SQL-запросов, которая возвращает CompletableStage 3) нужно превратить всё это в корутины.
источник

SM

Sergey Morgunov in Kotlin Moscow
Как-то так получилось:

fun <Request, Response> serviceCall(
   context: CoroutineContext = EmptyCoroutineContext,
   start: CoroutineStart = CoroutineStart.DEFAULT,
   block: suspend CoroutineScope.(request: Request) -> Response
): ServiceCall<Request, Response> = ServiceCall {
   CoroutineScope(Dispatchers.Unconfined).future(context, start) {
       block(it)
   }
}
источник

AN

Alexander Nozik in Kotlin Moscow
Sergey Morgunov
Как-то так получилось:

fun <Request, Response> serviceCall(
   context: CoroutineContext = EmptyCoroutineContext,
   start: CoroutineStart = CoroutineStart.DEFAULT,
   block: suspend CoroutineScope.(request: Request) -> Response
): ServiceCall<Request, Response> = ServiceCall {
   CoroutineScope(Dispatchers.Unconfined).future(context, start) {
       block(it)
   }
}
Сбор руками скоупа считается плохой практикой. Лучше делать future( contrxt + Dispatchets.Unconfined)
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Сложности-то вроде нет. Я вон за день впилил корутины в JMeter.

Но сложность возникла откуда не ждал. Решил сделать сравнительный замер: «5000 JavaThread’ов против корутин»
Что бы выд думали? Почти одинаковый результат, т.к. упёрлось всё в серверную часть (или в предел количества одновременных tcp соединений на mac / Docker’е или ещё где-то)
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Vladimir Sitnikov
Сложности-то вроде нет. Я вон за день впилил корутины в JMeter.

Но сложность возникла откуда не ждал. Решил сделать сравнительный замер: «5000 JavaThread’ов против корутин»
Что бы выд думали? Почти одинаковый результат, т.к. упёрлось всё в серверную часть (или в предел количества одновременных tcp соединений на mac / Docker’е или ещё где-то)
Т.е. добавил условно "Coroutine Group Executor"?
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
Т.е. добавил условно "Coroutine Group Executor"?
Примерно
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Sergey Morgunov
Как-то так получилось:

fun <Request, Response> serviceCall(
   context: CoroutineContext = EmptyCoroutineContext,
   start: CoroutineStart = CoroutineStart.DEFAULT,
   block: suspend CoroutineScope.(request: Request) -> Response
): ServiceCall<Request, Response> = ServiceCall {
   CoroutineScope(Dispatchers.Unconfined).future(context, start) {
       block(it)
   }
}
По-моему, тут плохо то, что будут утекать корутины. Нужно как бы structured concurrency использовать для правильного cancellation’а
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Sergey Morgunov
Как-то так получилось:

fun <Request, Response> serviceCall(
   context: CoroutineContext = EmptyCoroutineContext,
   start: CoroutineStart = CoroutineStart.DEFAULT,
   block: suspend CoroutineScope.(request: Request) -> Response
): ServiceCall<Request, Response> = ServiceCall {
   CoroutineScope(Dispatchers.Unconfined).future(context, start) {
       block(it)
   }
}
Выглядит ок
источник

SM

Sergey Morgunov in Kotlin Moscow
Alexander Nozik
Сбор руками скоупа считается плохой практикой. Лучше делать future( contrxt + Dispatchets.Unconfined)
А откуда скоуп взять? Мне как раз нужна точка старта
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Sergey Morgunov
А откуда скоуп взять? Мне как раз нужна точка старта
Его нужно «на самом верхнем уровне создать»
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Vladimir Sitnikov
Примерно
А есть код?
источник

AN

Alexander Nozik in Kotlin Moscow
Sergey Morgunov
А откуда скоуп взять? Мне как раз нужна точка старта
Скоуп лучше ресивером к функции поставить. Просто сейчас вы собираете скоуп без джоба - это эквивалент GlobalScope
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Vladimir Sitnikov
Его нужно «на самом верхнем уровне создать»
Это корутин билдер, и так самый верхний уровень
источник

AN

Alexander Nozik in Kotlin Moscow
Ruslan Ibragimov
Это корутин билдер, и так самый верхний уровень
корутин билдеры все в скоупах живут
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
А есть код?
источник

SM

Sergey Morgunov in Kotlin Moscow
А можно «на пальцах»? 😀 Я всё равно не понял, где же мне создать корневой скоуп так, чтобы это было правильно.
источник

AN

Alexander Nozik in Kotlin Moscow
Sergey Morgunov
А можно «на пальцах»? 😀 Я всё равно не понял, где же мне создать корневой скоуп так, чтобы это было правильно.
fun CoroutineScope.serviceCall
источник

AN

Alexander Nozik in Kotlin Moscow
Скоуп будет снаружи. Если его там нет, делаете Global. Хуже чем сейчас не будет
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Alexander Nozik
Скоуп будет снаружи. Если его там нет, делаете Global. Хуже чем сейчас не будет
На GlobalScope IDEA ругается (вроде) со словами «не используйте Global»
источник

AN

Alexander Nozik in Kotlin Moscow
Vladimir Sitnikov
На GlobalScope IDEA ругается (вроде) со словами «не используйте Global»
Ну так у него и так неявно глобал используется.
источник