
Roman
11.10.2018
05:46:09

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

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
Слушай, так это типа декларативных акторов?

Ayrat
11.10.2018
05:53:12

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 значение.
И чтобы что-то в него положить, надо чтобы кто-то готов был его забрать
у меня пример есть готовый, который это объясняет, ща
таймкод неслучаен

Pavel
11.10.2018
06:18:34

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
Что вы на меня расстройство идентичности какое-то постоянно наводите!
Кстати, чуваки, вы в курсе про хактоберфест?
MS даёт футболочки за контрибьюцию в опенсорс-проекты MS. Догадайтесь, куда можно наконтрибьютить?
В visualfsharp!

Vlad
11.10.2018
08:52:51
?

Google

Vladimir
11.10.2018
09:00:25

Friedrich
11.10.2018
09:00:49

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
Привет!