x
https://stackoverflow.com/questions/17197699/awaiting-multiple-tasks-with-different-results
x
чтобы показать превосходство
Andrew
Ну на task { } сделать можно
x
в эфшарпе же Async
Viacheslav
в эфшарпе же Async
есть TaskBuilder.fs
Andrew
в эфшарпе же Async
Фшарп хорошо позволяет их мешать
Andrew
Если это нужно
x
так вопрос не в этом
x
просто нужно показать что вот в шарпе как коряво композится асинхронность
x
но я не уверен что в эфшарпе лучше )
Vasily
Есть книжка хорошая
Vasily
Concurrency in .net
Vladimir
просто нужно показать что вот в шарпе как коряво композится асинхронность
Task.WhenAll же возвращает Таск от массива результатов, я его так и юзаю)
Roman
Оч простой и жизненный кейс, который в асинках лучше
Roman
ну и то, что у асинков холодный старт
Vladyslav
получается, такой случай в F# сложнее из-за холодных асинков а если юзать таски будет почти такой же код
Vasily
Интересно в c# посмотреть на реализацию сложного ретрая
Vladislav
Есть книжка хорошая
Parallel programming in .net - не она?
Vladislav
Или это другая
Vasily
https://www.amazon.com/Concurrency-NET-patterns-concurrent-programming/dp/1617292990
Viacheslav
лол, а в чём разница?
Shub
никто не помнит, где есть описание этой нотации как на слайде? я однажды находил на SO, но потерял ссылку
Vladimir
так у тебя результаты одного типа
точно, не заметил что именно это требуется) ну в фшарпе нету HKT, как и в сишарпе) можно это заэмулировать введя DU на все возможные типы результатов
George
Интересно в c# посмотреть на реализацию сложного ретрая
например. Докинуть задержку ретрая не сложно, если что. Что-то ещё не покроет? readonly struct RetryPolicy { public static RetryPolicy Default => new RetryPolicy(_ => false, maxAttempts: 3); //ctor goes here private readonly Func<Exception, bool> _condition; private readonly int _maxAttempts; public RetryPolicy WithMaxAttempts(int maxAttempts) => new RetryPolicy(_condition, maxAttempts); public RetryPolicy When(Func<Exception, bool> condition) => new RetyPolicy(e => _condition(e) || condition(e), _maxAttempts); //shugar for typed exceptions handling goes here // basic async overload public async Task<TOut> ExecuteAsync<TContext, TOut>(TContext context, Func<TContext, Task<TOut>> retryable) { var result = default(TOut); var attemptsLeft = _maxAttempts; while (attemptsLeft > 0) try { result = await retryable(context).ConfigureAwait(false); } catch (Exception e) when (_condition(e)) { attemptsLeft--; } return result; } }
George
А без Polly?
а где он тут?
Vladislav
чтобы показать превосходство
нету, там у нас тот же StartChild и потом let!
George
А без Polly?
это наколеночная реализация в инпуте телегочата за пару минут =)
x
А без Polly?
это же самоделка
Vasily
F? nmae
Vasily
ТЬфу
Vasily
Да, точно
Vasily
Но выглядит жосско
x
Но выглядит жосско
так это же типа хелпер, юзай внутрь не смотри
Vasily
К сожалению, мне очень часто приходится смотреть внутрб
x
а у меня обратный экспериенс: написал норм хелперов, а народ ноет что они внутри ужасные
x
ну, да
x
а конечный автомат асинк-авэйт не ужасный?
x
но всем норм
George
Но выглядит жосско
можно сделать чуть ближе к сердцу типичного шарписта на каком-нибудь ImmutableList (или даже mutable, если очень не хочется политики потом комбинировать) вместо кучи замыканий
George
если есть идеи, как на шурупе написать тот же функционал проще - буду рад услышать =)
Vasily
На фшарпе можно
Vasily
На сишарпе - не уверен
Vasily
Хотя можно попробовать через ContinueWith
George
все что в Immutable - тормозит
на чтение - тоже? Не особо в них копался
Vladislav
я больше про то что они очень хорошо кушают память без видимого профита
Vladislav
фшарп же хоть как-то оптимизирует свою иммутабельную хурму
Ayrat
например. Докинуть задержку ретрая не сложно, если что. Что-то ещё не покроет? readonly struct RetryPolicy { public static RetryPolicy Default => new RetryPolicy(_ => false, maxAttempts: 3); //ctor goes here private readonly Func<Exception, bool> _condition; private readonly int _maxAttempts; public RetryPolicy WithMaxAttempts(int maxAttempts) => new RetryPolicy(_condition, maxAttempts); public RetryPolicy When(Func<Exception, bool> condition) => new RetyPolicy(e => _condition(e) || condition(e), _maxAttempts); //shugar for typed exceptions handling goes here // basic async overload public async Task<TOut> ExecuteAsync<TContext, TOut>(TContext context, Func<TContext, Task<TOut>> retryable) { var result = default(TOut); var attemptsLeft = _maxAttempts; while (attemptsLeft > 0) try { result = await retryable(context).ConfigureAwait(false); } catch (Exception e) when (_condition(e)) { attemptsLeft--; } return result; } }
То же самое в фаршике type RetryPolicy = { MaxRetries: int ContinueOnError: exn -> bool } static member Default = { MaxRetries = 3 ContinueOnError = fun _ -> false } let retryWith policy work = let rec inner = function | 0 -> failwith "no retries left" | retriesLeft -> try work() with e when not (policy.ContinueOnError e) -> inner (retriesLeft - 1) inner policy.MaxRetries /// just retry already let retry = retryWith RetryPolicy.Default retry <| fun () -> printf ""
Ayrat
пихаешь всю ебанину в модуль, делаешь автоопен
Ayrat
асинхронная версия тривиальна
Vasily
Ну вот я понял, что сишарп неохота вспоминать
Крылатый
​​Американские ученые сделали невероятно прекрасное дело — показали, что крыс можно научить управлять транспортным средством. Для этого они сконструировали машинку из пластикового контейнера на колесиках, управлять которой нужно нажатием на три разных проволоки. Обучение в крысиной автошколе занимает до девяти месяцев и проходит успешнее, если крыс содержать в клетках с игрушками. Кроме того, езда на машинках, по-видимому, делает крыс эмоционально устойчивее: после обучения у них меняются уровни стероидных гормонов http://short.nplus1.ru/drivingrats
Крылатый
Ух ты.
Анна
Ну значит и меня научат 🤔
Анна
есть надежда
Vasiliy
Ну значит и меня научат 🤔
Аня, больше веры в себя. У тебя все получится. Там управлять делов то
Анна
Аня, больше веры в себя. У тебя все получится. Там управлять делов то
Спасибо! Но это я уже балуюсь. Я уже почти в себя поверила 🙃
Анна
Поеду завтра за город кататься 🌚
Анна
ещё бы инструктор поменьше нудел, что я его ласточку ломаю 😂
Анна
к этому кстати надо прислушиваться
я как бы не против, но я же не нарочно
Shub
я как бы не против, но я же не нарочно
это понятно. кроме того, он слегка преувеличивает. но ты запоминай, на что он жалуется
Анна
С газом переборщила на эстакаде
Shub
был случай в моей личной практике, после которого я стал делить на людей, прогревающих машину, и людей, машину не прогревающих. вторая категория не далее как вчера жаловалась, что тратит дохрена денег на сервис: аккумуляторы меняют раз в сезон, масляные насосы, внезапно повышенный износ на клапанах, попали на смену колец и т.п.
Shub
вчера вот один знакомый струхнул не на шутку: им возле школы сказали, что "от вашей машины сильно пахнет газом". они чуть было не ломанулись в PS&G и только через полчаса вспомнили, что gas - это еще и бензин
Shub
дело оказалось проще: холодная машина, школа в 5 минутах езды. осень и влажность.
Крылатый
Shub
опция
Shub
причем у нас нельзя стоять на холостых более 3 минут
Крылатый
Почем
Крылатый
у?
Анна
Нда, у меня пока проблемки с тем, чтобы на педаль плавно жать 🤔