Size: a a a

Scala User Group

2020 February 16

KS

Kirill Shelopugin in Scala User Group
Получается, что EC тоже _должен_ быть один
источник

SA

Sergey Alaev in Scala User Group
Kirill Shelopugin
ContextShift is the pure equivalent to:

Scala’s ExecutionContext
к сожалению, в скаладоке к этому не очень удачному трейту написана фигня. Сам смотри - одну и ту же операцию, выполнение синхронного кода на тредпуле, можно сделать двумя способами - shift и evalOn. Я пробовал разные варианты и пришел к озвученному.
источник

NP

Nikita Pedorich in Scala User Group
Юрий Бадальянц
Ещё - заверни именно операции с hbase в отдельный блокирующий пул, а всё остальное ио делай на основном пуле.
Hbase операции у меня обернуты в Sync[M].delay, то есть они могут быть и SyncIO и IO. А уже на уровне роутов я имплиситно подсовываю IO Marshaller, как тут https://github.com/holidaycheck/easy-akka-http/blob/master/easy-akka-marshalling/src/main/scala/com/holidaycheck/akka/http/FMarshaller.scala#L23
источник

GP

Grigory Pomadchin in Scala User Group
ну кстати апи HBasа может возвращать CompletableFuture https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/client/class-use/AsyncConnection.html (с версии 2.0)
источник

KS

Kirill Shelopugin in Scala User Group
Ну, раз ты пришёл к способу, значит, он единственно верный. Опять эти авторы котов сами сделали ерундовые доки к коду, который сами и написали, засранцы
источник

NP

Nikita Pedorich in Scala User Group
Grigory Pomadchin
ну кстати апи HBasа может возвращать CompletableFuture https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/client/class-use/AsyncConnection.html (с версии 2.0)
У нас 1.1.2 :(
источник

SA

Sergey Alaev in Scala User Group
Kirill Shelopugin
Ну, раз ты пришёл к способу, значит, он единственно верный. Опять эти авторы котов сами сделали ерундовые доки к коду, который сами и написали, засранцы
с чего ты решил, что он единственно верный? у тебя какой-то религиозный взгляд на мир, где и авторы котов, и я излагают инсключительно неопровержимые истины, и еретиков надо сжигать.
источник

NP

Nikita Pedorich in Scala User Group
Sergey Alaev
к сожалению, в скаладоке к этому не очень удачному трейту написана фигня. Сам смотри - одну и ту же операцию, выполнение синхронного кода на тредпуле, можно сделать двумя способами - shift и evalOn. Я пробовал разные варианты и пришел к озвученному.
Что значит "пришел"? Увидел падение производительности в другом случае?
источник

GP

Grigory Pomadchin in Scala User Group
@pedorich_n ты знаешь можешь принатнуть треды просто внутри IO / конвертнутой футуры
источник

GP

Grigory Pomadchin in Scala User Group
что бы не гадать просто распечатай где у тебя что выполнилось
источник

NP

Nikita Pedorich in Scala User Group
Grigory Pomadchin
что бы не гадать просто распечатай где у тебя что выполнилось
хм, действительно
источник

KS

Kirill Shelopugin in Scala User Group
Sergey Alaev
с чего ты решил, что он единственно верный? у тебя какой-то религиозный взгляд на мир, где и авторы котов, и я излагают инсключительно неопровержимые истины, и еретиков надо сжигать.
Автор кода написал документацию к коду, который сам же и написал. Есть небольшая вероятность, что он знает лучше, что он хотел выразить этим кодом, т.к. он его и писал
источник

SA

Sergey Alaev in Scala User Group
Nikita Pedorich
Что значит "пришел"? Увидел падение производительности в другом случае?
Я уже писал - трейт ContextShift позвляет сменить тредпул двумя разными способами. shift, конечно, быстрее, но он имеет неустранимый недостаток - потеря контроля, на каком пуле мы исполняемся.
источник

SA

Sergey Alaev in Scala User Group
Kirill Shelopugin
Автор кода написал документацию к коду, который сам же и написал. Есть небольшая вероятность, что он знает лучше, что он хотел выразить этим кодом, т.к. он его и писал
в котах не все решения удачные, и ContextShift однозначно неудачное решение. Но надо как-то с ним жить.
источник

SA

Sergey Alaev in Scala User Group
ContextShift как абстракция тредпула плох - т.к. просто не позволяет банально выполнить задачу на этом тредпуле.
Зато у него есть отличный метод "давай выполним тяжелую синхронную таску на другом тредпуле".
источник

SA

Sergey Alaev in Scala User Group
Иными словами, это не трейт для тредпула, который мы хотим использовать, это трейт для "текущего" тредпула. Но он такой неудобный, что имеет смысл держать инстанс только для дефолтного тредпула для интерпретатора IO.
источник

ЮБ

Юрий Бадальянц in Scala User Group
Nikita Pedorich
Hbase операции у меня обернуты в Sync[M].delay, то есть они могут быть и SyncIO и IO. А уже на уровне роутов я имплиситно подсовываю IO Marshaller, как тут https://github.com/holidaycheck/easy-akka-http/blob/master/easy-akka-marshalling/src/main/scala/com/holidaycheck/akka/http/FMarshaller.scala#L23
Это какая-то странная обёртка, я хз зачем это. Просто делай всё в ио, блокируйся на блокере, а в самом конце сделай unsafeToFuture.
источник

NP

Nikita Pedorich in Scala User Group
Юрий Бадальянц
Это какая-то странная обёртка, я хз зачем это. Просто делай всё в ио, блокируйся на блокере, а в самом конце сделай unsafeToFuture.
А IO.apply - это не тоже самое что Sync[M].delay, где M - это IO? Типа Tagless Final
источник

ЮБ

Юрий Бадальянц in Scala User Group
Nikita Pedorich
А IO.apply - это не тоже самое что Sync[M].delay, где M - это IO? Типа Tagless Final
Да, это оно
источник

ЮБ

Юрий Бадальянц in Scala User Group
Лучше не надо полагаться на имплиситы при работе с блокирующим ио. Делай на блокере всё явно, а потом возвращайся в обычный пул
источник