Hog
Я чо-то этим микроскопом начал столько гвоздей забивать
Ayrat
а async await для for/foreach въезжает в ЯЗЫК
Ayrat
а наши asyncSeq - это просто нугет
Ayrat
так что не совсем корректно
Ayrat
но в F# нет смысла асинкСек в кор либу вгонять так-то
Hog
https://twitter.com/isaac_abraham/status/1064920177375100930?s=12
Ayrat
Крылатый
Утра!
Hog
У него там ещё гист есть к этому пропозалу. Но там чо-то сложно. Я написал в 3 пайпа с асинксеком.
Ayrat
Ayrat
мне никогда Async.Parallel не нравился. крайне бесполезная имплементация
Ayrat
там даже уровень параллелизма не задать
Ayrat
и т.к. Asynс работает на тред пуле, запуск Async.Parallel на массиве в 1000 элементов унизит этот самый тредпул.
Ayrat
нахера он нужен - неясно
Hog
Угу...
Hog
А гопак с асинксеком в этом примере - прям братья-близнецы :)
Ayrat
На этом да. Апи гопака просто побольше, а так мысль та же
Vladislav
Hog
Только разные отцы!
Ayrat
x
Vladislav
Vladislav
Там несколько стратегий по чанкованию и тп
Ayrat
Вот как НЕ надо делать
берут все пришедшие таски и хуярят через QueueWorkItem в шедулер
https://github.com/Microsoft/visualfsharp/blob/87ea864488b2b7223ce0da1bfe3150df375b7b14/src/fsharp/FSharp.Core/async.fs#L1254
Ayrat
имплементация от бога просто
Ayrat
Ayrat
можно и на акку
Ayrat
слезть нереально. Потом уже стрим головного мозга начинается
Ayrat
везде мерещатся
Vladislav
Опиоиды
Ayrat
ВСЁ ПОТОК ДАННЫХ
x
Меня тогда точно выгонят ) но это давно пора сделать
Vladislav
Ayrat
но кто-то пилил, я давно видел какую-то альфу, не интересовался
Hog
Doge
Потом удивляешься как без них жил
gsomix
Ayrat
меньше забот
Ayrat
Всё тлен
всё стрим.
Вот чатик наш это стрим сообщений.
А сообщения - стрим символов.
Ayrat
а ты подписался на стрим???
Doge
В акка стримах ещё прикольно, что до передачи в материализатор - они просто описание графа данных и соотвественно, при должном желании можно свой кастомный материализатор написать, если хочется чего-то совсем экзотического.
Ayrat
Ayrat
т.е. они итерируются по запросу, пока не фолдишь, не итерируешь (не материализиурешь), они даже не почешутся исполнятся
Ayrat
соответственно фолдеров, итераторов (материализаторов) можно хоть тонну навесить на один и тот же стрим
Ayrat
и все разные!
Ayrat
Doge
x
так асинкЕнумерабл это вообще что, как он от обсервабл отличается?
Doge
Я из реактивных ленивых стримов только скаловские akka-stream и fs2 трогал.
Ayrat
а т.к. FSharp.Async и Hopac.Job ленивые - то в них можно
Ayrat
Ayrat
IObservable, это ты подписываешься на источник данных и не контролируешь сколько он тебе пошлёт, он тебя может завалить пушами, это ты сам разгребать должен
Это push модель
Ayrat
Enumerable (и соответственно AsyncEnumerable) это ты ПРОСИШЬ продьюсер дать тебе элемент, вытягивая его когда надо консьюмеру
это pull модель
Ayrat
push модель работает на пределе продьюсера (без простоя), но с простоями консьюмера или его оверфлоу (соответстенно нужны стратегии дропа сообщений чтобы не было этого оверфлоу)
pull модель работает на пределе консьюмера (без простоя), но с простоями продьюсера
Hog
Ayrat а в твоём примере с гопаком - результаты не будут ли в обратном порядке?
Ayrat
акка стримы имеют бекпрешур, т.е. пропагирование простоев консьюмера на продьюсера (апстрим) чтобы он охладил трахание и не посылал больше
Ayrat
соответстенно эта пропагация работае на все этапы стримы вплоть до сорца. Т.е. сорс не будет больше генерить элементов если даунстрим НЕ ТАЩИТ
Ayrat
Ayrat
но это эффективнее на больших стримах чем в ресайз эррей складывать
Ayrat
но только на ОЧЕНЬ больших стримах
Ayrat
до 5 ресайзов вполне норм в ресайз эррей сложить. Там начальные переаллокации не очень больше, а вот последние уже не очень
Ayrat
вот был бы наш лист мутабельным линкед листом, то для него есть очень крутой алгоритм переворачивания стрелок линков без аллокаций
Ayrat
красота была бы. Сложил всё без переаллокаций в линкед лист в обратном порядке, а потом мутируя лист стрелки перевернул и всё
Vasily
Hog
Ayrat
это ж дёшево и помогает
Ayrat
хотя стой, я тут подумал что можно и без ссылки на последний
такой лист
A -> B -> C
начинаем с A
смотрим что впереди:
если есть элемент:
сохраняем линк на него и обнуляем линк у A
идем по сохраннёному элементу
запоминаем его NextLink в локальную переменную
Перезаписываем линк у B чтобы он смотрел на А
запускаем тот же алгоритм для элемента во временно сохраннёном линке
если элемента впереди A нет, заканчиваем алгоритм
Ayrat
надо накидать псевдокод, вроде должно работать
Vasily
В теории да
Vasily
Переворот за один проход
Ayrat
ну да