@scala_ru

Страница 1261 из 1499
Vadim
05.02.2018
15:31:24
ну подробнее - ты пусканул фбчу и ждешь у себя ее результат - она обосралась - максимум что ты можешь этопоймать невнятный Failure с ошибкой - от чего оно прилетело хрен поймешь.

Ivan
05.02.2018
15:31:45


Google
Александр
05.02.2018
15:35:27
а что если, акка людям не нравиться потому что они внутри аккторов futueres готовят ?

Oleg
05.02.2018
15:36:02
это сообщение набирала собака

Vadim
05.02.2018
15:37:08
recover можно на future сделать и мапнуть на что-то типа ErrorFromDb
ну норм варик, я обычно просто в onCompelte маплю на евенты

Александр
05.02.2018
15:37:33
а c евентами что делаешь ?

Oleg
05.02.2018
15:37:54
> а что [,] если <,> акка людям не нравит<ь>ся потому[,] что они внутри ак<к>торов futu<e>res готовят ?

Александр
05.02.2018
15:38:36
> а что [,] если <,> акка людям не нравит<ь>ся потому[,] что они внутри ак<к>торов futu<e>res готовят ?
может вы на собесе, еще заставляете людей писать код на бумажке, чтобы компилилось?

Oleg
05.02.2018
15:39:01
Vadim
05.02.2018
15:39:05
ну много чего можно сделать - сменить стейт , прибить актор, уйти в таймаут-рейтрай ...

Oleg
05.02.2018
15:39:13
[рожа]

Nikolay
05.02.2018
15:39:20
@yourNightCurator готовь каверзные вопросы Олегу на митап

Google
Alexey
05.02.2018
15:39:33
может он с телефона? я вот часто читаю чатик в автобусе

Александр
05.02.2018
15:39:35
Мы вообще компилим на бумажке. СБТ слишком медленный
у меня батя так биткоины в союзе с друзьями в гараже майнил

KrivdaAllStars
05.02.2018
15:39:40
finch не позволяет закрывать response в другом месте(не знаю просто) ? есть же кувырок через RequestProxy, в akka-http так можно
val result = Promise[GetResponse] system.actorOf(RequestHandler.props()) ! Get result.map { case error: ErrorResponse => val content = error.asJson.noSpaces error match { case UserTimeOut => case NoObject => case NoUser => } Output.payload(content, Status.NotFound) case rsp: Response => Ok(rsp.asJson.noSpaces) case _ => BadRequest(new RuntimeException("server error")) } class RequestHandler() extends Actor { context.system.scheduler.scheduleOnce(maxRequestDuration) { self ! UserTimeOut } override def receive: Receive = { case Get => context.become(awaitInfo(respone)) } def awaitInfo(response: Promise[GetResponse]): Receive = { case resp: GetResponse => response.setValue(resp) context.stop(self) } }

Александр
05.02.2018
15:39:53
Oleg
05.02.2018
15:40:12
получал транзакции заказным письмом?

Nikolay
05.02.2018
15:40:34
голубями

Oleg
05.02.2018
15:40:46
или forall город. меня в городе не будет?

Александр
05.02.2018
15:41:22
в каком?
filter(_.hasTinkoffOffice)

Nikolay
05.02.2018
15:42:05
Seq.empty[City].filter(_.hasTinkoffOffice) :+ City(2)

Oleg
05.02.2018
15:42:53
Seq.empty[City].filter(_.hasTinkoffOffice) :+ City(2)
результат City.apply должен быть Traversable

Oleg
05.02.2018
15:43:18
или на :+

KrivdaAllStars
05.02.2018
15:44:34
некоторый костыль который приходится делать для связки финча и актор системы
как это каноничней сделать и лучше, я бы хотел услышать (

Nikolay
05.02.2018
15:44:41
пушнул фикс

Oleg
05.02.2018
15:48:24
увидел пастебин » не открываю

KrivdaAllStars
05.02.2018
15:50:11
Под каждый запрос создаеться актор который и рулит ответом но это для akka-http https://pastebin.com/8JWJFu3v
ну тут собственно так и сделано :) просто это к вопросу о финче, с пометкой о том, что лучше ничего не придумал

Google
Oleg
05.02.2018
15:51:09
Kirill
05.02.2018
15:55:06
Пацаны, есть ли легкий способ линеаризовать какие-то вычисления без использования акки? Чтобы, например, так: def linearize[T](action: => Future[T]): Future[T] и гарантировать, что все вызовы linearize будут выполняться строго последовательно, где бы в коде я ни вызвал? Считаем, что этот метод есть в каком-то классе, инстанс которого я шарю между всеми целевыми точками использования.

Oleg
05.02.2018
15:56:17
как это каноничней сделать и лучше, я бы хотел услышать (
а ещё лучше вот так val responseActorRef = MVar.empty[Response] val future = ref.read

Kirill
05.02.2018
15:58:16
тредпул с 1 потоком же
Ну, я задачу упростил тут, вообще хотелось бы линеаризовать относительно какого-то ключа, тут такой тредпул не зайдёт :)

Александр
05.02.2018
15:58:54
каждому ключу по тредпулу

Kirill
05.02.2018
15:59:26
Самое главное, чтобы линеаризовались именно эффекты, а не только результаты

def linearize[A](action: => Free[Future, A]): Free[Future, A] = Free.defer(action)
Это похоже на мониксовый дефер, но как это поможет, когда 1000 потоков из разных мест кода независимо ринутся вызывать этот метод, и нужно будет выстроить эффекты в строгую цепочку?

Oleg
05.02.2018
16:02:06
а складываются во фри

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

то MVar

for { value <- mvar.take newVal <- actions(value) _ <- mvar.put(newval) }вместо тысячи акторов

Kirill
05.02.2018
16:07:48
А, нет, я не хочу их потом вручную запускать. Это как очередь, в которую с одной стороны сколько угодно человек запихивают, а с другой - один разгребает. Только акторки one-by-one изначально гарантируют

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

Kirill
05.02.2018
16:10:49
Observable
Да, я туда посмотрел, но я смотрел недолго, и не нашёл ничего такого, что позволило бы мне сделать такой вот api, который я описал, с непрерывно разгребающейся в любой момент очередью. Видимо плохо смотрел

Google
Kirill
05.02.2018
16:18:47
не очень понял контракта твоего апи
trait Linear { def linearize[T](f: => Future[T]): Future[T] } val l: Linear = ??? в одном месте: l.linearize(Future.successful(1)) в другом l.linearize(Future.successful(2)) Эффекты выполняются линеаризованно, хоть эти места друг от друга вообще не зависят.

Или я просто уже под вечер плыву, но возможно обсервабл мне действительно как-то поможет, там есть mapAsync, и может быть, его можно как-то натравить на какой-то бесконечный итератор, которому можно подбрасывать элементы.

Александр
05.02.2018
16:27:02
удобнее ли это будет чем акторы ?

покажи потом что вышло

Oleg
05.02.2018
16:42:34
trait Linear { def linearize[T](f: => Future[T]): Future[T] } val l: Linear = ??? в одном месте: l.linearize(Future.successful(1)) в другом l.linearize(Future.successful(2)) Эффекты выполняются линеаризованно, хоть эти места друг от друга вообще не зависят.
C мониксом можно, но не самое приятное, делать штуку, которая хаотично внезапно может куда-то что-то запихнуть Можно через BufferedObserver, можно через хитрый MVar[Seq] Но самое простое, что я нашёл - это стримы val buttHole = Source .actorRef[() => Future[String]](1000, OverflowStrategy.dropNew) .mapAsync(1)(_ ()) .toMat(Sink.foreach(???))(Keep.left) .run()

IG
05.02.2018
16:43:22
ок

Oleg
05.02.2018
16:45:21
пофиксил, теперь buttHole - это ActorRef

Kirill
05.02.2018
16:45:44
спасибо

удобнее ли это будет чем акторы ?
Удобнее, с акторами там приходится отправлять актору сообщение аском, чтобы результат получить, что весьма такое себе.

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

Александр
05.02.2018
16:51:46
а гоняет кто-нить jackson-module-scala вместе с Enumeration магией ?

Oleg
05.02.2018
16:53:45
Да, мне эти варианты приходили в голову, с мваром я пытался наколбасить, но там оказалось слишком хитро. Похоже, что с акторрефом будет самое простое
но я не уверен, что mapAsync не решит вдруг исполнить получитт фьючу, пока ждёт результата предыдущей для уверенности можно на Sink.foldAsync заменить

Kirill
05.02.2018
16:56:46
но я не уверен, что mapAsync не решит вдруг исполнить получитт фьючу, пока ждёт результата предыдущей для уверенности можно на Sink.foldAsync заменить
Да что-то я подумал, что получившийся ActorRef всё равно придется аском спрашивать, или же давать ему какой-то промис, чтобы стрим его комплитил, что еще более геморройно

Kirill
05.02.2018
16:58:20
тебе нужен акноуледж?
Нужен результат, как в контракте и было

Даю-то я by-name параметр, а получить хочу запущенную футуру с результатом

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

Daniel
05.02.2018
17:00:36
я сегодня совсем плох, но позволь прояснить чем аск тебя не устраивает раз уж про акторы?

Kirill
05.02.2018
17:01:56
Интуитивно не устраивает) Я же спрашивал с целью избавиться от акторов, а пришли всё равно к акторному решению

Google
Daniel
05.02.2018
17:02:23
я правильно понимаю, что многие могут спросить твой сериализатор, и каждому надо ответить только его результатом?

просто это оч все смахивает на кусок шедулера потоков - очередь и разгребатор

Kirill
05.02.2018
17:03:28
Собственно, я почти так выше и описывал про разгребать )

Daniel
05.02.2018
17:04:34
ну и как бы это неприятно не было, это оч похоже на актор

Kirill
05.02.2018
17:04:35
И про очередь сказал:) Просто очень хочется с акторов с аском это на что-то более человечное перевести, не очень мне нравятся эти вот Any, стектрейсы вглубь акки итд

Daniel
05.02.2018
17:05:08
ну тогда свой класс с очередью внутри

или попробуй этих мягких тёплых типизированных акторов

Oleg
05.02.2018
17:07:00
Нужен результат, как в контракте и было
хм ну тогда, наверное,как упоминали, супер-простой выход это mySched = Scheduler(SynchronouaExecution) ... Task.fork(Task.deferFuture(...), mySched))

Kirill
05.02.2018
17:08:30
хм ну тогда, наверное,как упоминали, супер-простой выход это mySched = Scheduler(SynchronouaExecution) ... Task.fork(Task.deferFuture(...), mySched))
Ага, а теперь мне надо линеаризовать относительно ключа, а делать по executor на ключ, сам понимаешь, не вариант. Ну ладно, придётся оставить как есть )

Oleg
05.02.2018
17:21:05
Ага, а теперь мне надо линеаризовать относительно ключа, а делать по executor на ключ, сам понимаешь, не вариант. Ну ладно, придётся оставить как есть )
ну тогда точно MVar val synchonizers = MVar(Map.empty[Map[String, MVar[Unit]]) val result = synchronizer(key) flatMap sync(action) def synchronizer(key: String) = for{ syncs <- synchronizers.take s = syncs.get(key).getOrElse(MVar(())) _ <- synchronizers.put(syncs +(key -> s) } yield sync def sync(action: => Future[A])(s: MVar[Unit]): Task[A] = for{ _ <- s.take res <- Task.deferFuture(action) _ <- s.put(()) } yield res

код с телефона в метро, не обессудь

фактически как актор пул но с мварами вместт акторов

Nikolay
05.02.2018
17:23:53
код с телефона в метро, не обессудь
http://phonesdata.com/files/models/Motorola-MILESTONE-900.png такой нужен

Andrey
05.02.2018
17:24:31
У мя был такой

Страница 1261 из 1499