@Fsharp_chat

Страница 752 из 772
Pavel
11.10.2018
05:46:14
нет.. не взлетело. выполнение сразу прекращается

Roman
11.10.2018
05:46:17
Ayrat
11.10.2018
05:46:26
Google
Ayrat
11.10.2018
05:46:33
там блока нет в main

он на фоне 3 джобы запускает неблокируеще и всё, чтобы у меня fsi был отзывчивый

тебе, в консольном приложении надо явный блок сделать, либо как ты делал через ожидание всех 3х работ, либо чот ещё

Pavel
11.10.2018
05:47:26
ок

Ayrat
11.10.2018
05:47:33
левая часть выражения?
типа левую отбрасываем, берём сразу правую

аналог someJob >>= fun jobResult -> someValue someJob >>=. someValue

Roman
11.10.2018
05:48:23
ок спс)

Ayrat
11.10.2018
05:48:26
ну т.к. это байнд, справа должна быть джоба тоже, да

Pavel
11.10.2018
05:50:24
тебе, в консольном приложении надо явный блок сделать, либо как ты делал через ожидание всех 3х работ, либо чот ещё
let jobs = [ job { return! heart() } job { return! print() } job { return! getKey |> Job.onThreadPool } ] let concurrentJobs = Job.conIgnore jobs run concurrentJobs норм?

Ayrat
11.10.2018
05:50:45
let main _ = [ heart() :> Job<_> print() :> Job<_> Job.onThreadPool getKey ] |> Job.conIgnore |> run printfn "Done" 0

Grigoriy
11.10.2018
05:52:56
Слушай, так это типа декларативных акторов?

Google
Grigoriy
11.10.2018
05:54:34
Ну вот есть карбид, печать и ввод. Вместо сообщений ты их хитро завайрил

Ayrat
11.10.2018
05:55:49
ну... эээ... это норма!)

Grigoriy
11.10.2018
05:57:14
Фор хум хау! :)))

Ayrat
11.10.2018
06:00:30
open System.IO let degree = 24 let asyncMock x = async { do! Async.Sleep 100 return x } let inline (>>-) x f = async.Bind(x, f >> async.Return) let a = let files = (DirectoryInfo "***").GetFiles() let results = Array.zeroCreate files.Length files |> fun x -> x |> Array.sortInPlaceBy (fun x-> x.Length); x |> Seq.map asyncMock |> Seq.indexed |> Seq.groupBy (fun (i,_) -> i % degree) |> Seq.map (fun (_, group) -> async { for order, asyncWork in group do let! result = asyncWork results.[order] <- result }) |> Async.Parallel >>- fun _ -> results

оцени способ сортировки и группировки

Pavel
11.10.2018
06:03:31
вернулся оживить первый вариант

походу ключевая фича keyboard |> Job.onThreadPool

с ней работает нормально

Ayrat
11.10.2018
06:04:51
это возможно, т.к. стилинга у гопака нет, если есть очередь работ в один поток и внезапно одна работа лочит, то вся очередь за ней стоит и дрочит)

т.е. блокировать нельзя. Надо выделять это на тредпул и оставлять гопаку его треды для шедулинга

в обычном дотнете это тред пул сам решает через увеличение тредпула (до лимита)

Pavel
11.10.2018
06:07:19
дык. один фиг не вкурил. как? 1 нажатие лочит, второе разблокирует. е

и так без останову. нечетные лочат четные пускают

Ayrat
11.10.2018
06:10:22
тут надо вспомнить что джобы синхронные, а в ченел помещается 1 значение. И чтобы что-то в него положить, надо чтобы кто-то готов был его забрать

у меня пример есть готовый, который это объясняет, ща

дык. один фиг не вкурил. как? 1 нажатие лочит, второе разблокирует. е
про дедлоки и локи в гопаке если ты юзаешь ченелы и рекурсивные джобы! https://www.youtube.com/watch?v=tXf5_0pWWnI&t=1h44m19s

таймкод неслучаен

Ayrat
11.10.2018
06:33:15
гляну спс. ща к тыртубу доступа нет
да, я глянул ещё раз, гопак это дело шедулит на одном потоке поэтому блок этого потока (через ReadKey) убивает шедулинг, хотя явно heart хочет отдать в pchannel, а print взять из pchannel, т.е. рандеву должно произойти. Но т.к. они стоят континуейшном в одном гопаковском воркере, который заблочен Console.ReadKey, они никогда не встретятся =) Как только ты тред разлочиваешь, то происходит рандеву, всё оживает

Pavel
11.10.2018
06:43:37
нефигасе. а джобы нерекурсивяться чтоли?

Google
Pavel
11.10.2018
06:43:59
let rec keyboard () = job { if System.Console.KeyAvailable then match (System.Console.ReadKey true).KeyChar with | 'q' -> do! Ch.give hchannel Terminate do! Ch.give pchannel Terminate () | key -> do! Ch.give pchannel (Key key) return! keyboard () else return! keyboard () }

какого тут SO прилетает?

Ayrat
11.10.2018
06:48:15
Пока неясно. Тейлрекурсию компилятор же делает

Pavel
11.10.2018
06:48:45
let rec keyboard () = job { return! keyboard () } еще быстрее сдыхает

Vasily
11.10.2018
06:52:10
Миллиард джобов жеж

Pavel
11.10.2018
06:55:32
так они по памяти должны сдохнуть а не SO

Vasily
11.10.2018
06:57:06
Памяти мало жрут,не успевают

Pavel
11.10.2018
06:58:19
а СО откуда берется если тейлрекусия должна быть?

Vasily
11.10.2018
06:59:09
А где там тейл рекурсия?

Ayrat
11.10.2018
07:00:26
А где там тейл рекурсия?
да вроде она самая, другое дело что должер ядро унизить одно и всё

аааа

это всё f# и eager evaluation

Job.delay надо

Pavel
11.10.2018
07:06:11
хм... асинк вроде из коробки это разруливает

Vasily
11.10.2018
07:07:35
Ну return! в асинке похитрее скорее всего

Ayrat
11.10.2018
07:07:56
да, тут что-то не то. тоже проверил. Вообще с SO в гопаке не сталкивался, тут странно

я понял почему не сталкивался - билдером я не пользуюсь))) let rec j() : Job<unit> = timeOutMillis 0 >>= j j() |> run прекрасно рекурсится

так тоже работает let rec j2(): Job<unit> = job { do! timeOutMillis 0 return! j2() } j2() |> run

Google
Ayrat
11.10.2018
07:13:46
походу какая-то хрень с тривиальным случаем, надо смотреть

Vasily
11.10.2018
07:16:16
Ну в билдер имеет смысл глянуть

Ayrat
11.10.2018
07:20:14
Нет, разница в том как async.Delay и Job.delay реализован

вот минимальный репро: let rec jRec(): Job<unit> = Job.delay jRec let rec aRec(): Async<unit> = async.Delay aRec jRec() |> run //SO aRec() |> Async.RunSynchronously //Everything is OK

дилей из гопака member inline __.Delay (u2xJ: unit -> Job<'x>) = u2xJ делей из асинка member __.Delay generator = CreateDelayAsync generator

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

при этом компилятор первый случай не видит как тейл рекурсию (хз, я не спец) и ничего не оптимизирует. Вторая явная тейлрекурсия через трамплины - всё ок в любом случае

короче, в неткоре вообще не воспроизводится. Всё оптимизируется, не смотря на флаг Tailcalls

я до этого fsi тестил, он на фул фреймворке, я хз какой там флаг tailcalls и вообще

Ilya
11.10.2018
07:59:32
Мб в релизе джит нормально джиттит, а не в релизе нет. fsi же наверное в дебаге работает?

Vladimir
11.10.2018
08:31:45
https://sharplab.io/
Ну вот мне надо сделать левое окошко только + с загруженной своей сборкой чтобы работал автокомплит на мой код

Friedrich
11.10.2018
08:50:27
Мда,в жидбрейнс берут только мастеров своего дела
«у нас» == в компиляторе F#, а не в JB.

Что вы на меня расстройство идентичности какое-то постоянно наводите!

Кстати, чуваки, вы в курсе про хактоберфест?

MS даёт футболочки за контрибьюцию в опенсорс-проекты MS. Догадайтесь, куда можно наконтрибьютить?

В visualfsharp!

Vlad
11.10.2018
08:52:51
В visualfsharp!
Щас, только phd получу

?

Google
Vladimir
11.10.2018
09:00:25
А там для F# вообще работает автокомплит?
похоже нет, но я и на C# даже готов) лишь бы была проверка кода

Vladimir
11.10.2018
09:02:06
да, я уже сделал, сбилдить не получилось) там нужно установить питон а питон ругается на ошибки tls, т.к. у меня контора через свои сервера пропускает весь трафик)

Friedrich
11.10.2018
09:02:29
Типикал питон :(

Ayrat
11.10.2018
10:05:55
лол, вы знали что ТАК можно? > let expr = <@@ 2 * _ @@>;; val expr : (Expr<int> -> Expr<int>)

можно подать в квотейшн пустое место и вернётся функция, которая потом этот квотейшн пересчитает!

Friedrich
11.10.2018
10:06:15
Э, это как?

Это спецсинтаксис только для квотейшенов?

Ayrat
11.10.2018
10:06:39
Friedrich
11.10.2018
10:06:45
Угу. Я тоже.

Ayrat
11.10.2018
10:07:53
а не, сниппет устарел походу. в FSI не работает

это Томас Петричек писал здесь http://tomasp.net/blog/fsharp-dynamic-lookup.aspx/

@fvnever it works!!!11 let expr x = <@ 2 * %x @>

Friedrich
11.10.2018
10:10:33
Ну ок, про такое я знаю.

Ayrat
11.10.2018
10:10:53
ну это то же самое

Friedrich
11.10.2018
10:11:13
Да, работает так же. Я просто думал, что там в языке есть какие-то дырки готовые.

Но так тоже норм.

Ayrat
11.10.2018
10:11:35
Их убрали видимо. были в 2009ом

Язык деградировал!

Vladimir
11.10.2018
11:37:56
Типикал питон :(
победил таки спустя два часа питона и остальных) осталось понять куда свою сборку подсунуть

Roman
11.10.2018
11:45:44
Привет!

Страница 752 из 772