
Grigoriy
09.10.2018
17:04:30
ща!

Ayrat
09.10.2018
17:05:26
да, так можно

Grigoriy
09.10.2018
17:05:44
AsyncSeq.bufferByCountAndTime
есть над чем подумать :)

Google

Grigoriy
09.10.2018
17:06:51
спасибище!

Ayrat
09.10.2018
17:20:23
Там в стримах оно есть уже.
Stream.mapPipelinedJob

Grigoriy
09.10.2018
17:21:11
ты прям склоняешь :)

Ayrat
09.10.2018
17:22:15
И работает так как тебе надо!
Не чанками, а с постоянным уровнем параллелизма

Grigoriy
09.10.2018
17:23:17
я, вот смотрю на AsyncSeq.bufferByCount - те же чанки :(

Ayrat
09.10.2018
17:23:17
Так что один таймаут из чанка не подвесит весь чанк и программу впридачу
Да, я тебе говорил!
Я там даже ишью год назад сделал
Мне сказали - так и задумано

Grigoriy
09.10.2018
17:24:28
а iterAsyncParallelThrottled -> Async<unit> :(

Ayrat
09.10.2018
17:24:58
Стримыыы

Google

Ayrat
09.10.2018
17:25:04
(гопак)

Grigoriy
09.10.2018
17:25:26
ну AsyncSeq - оно тоже стрим... по идее
для моей задачи гопак (наверное) - из пушки по воробьям

Ayrat
09.10.2018
17:26:34
Ну как знаешь.
Всегда можешь навелосипедить воркеров на мейлбоксах

Roman
09.10.2018
17:27:31
https://github.com/gusty/ScrapeM

Ayrat
09.10.2018
17:27:34
Рекурсивненько и все такое
О, с этим парнем в Дублине пиво пил

Roman
09.10.2018
17:28:53

Ayrat
09.10.2018
17:29:21
Да. Он в Джете

Roman
09.10.2018
17:29:49
круто, привет ему)

Grigoriy
09.10.2018
17:40:53
Directory.GetFiles(source)
|> Seq.filter filterFn
|> Seq.map (fun f ->
async {
use file = File.OpenRead(f)
return! this.UploadFile(drive, Path.Combine(target, Path.GetFileName(f)), file)
})
|> AsyncSeq.ofSeq
|> AsyncSeq.bufferByCount 10
|> AsyncSeq.mapAsync (fun c -> c |> Async.Parallel)
|> AsyncSeq.concatSeq
|> AsyncSeq.toArrayAsync
те же чанки, но с человеческим лицом

Ayrat
09.10.2018
17:44:39
let requestMasterAsync limit urls =
let results = Array.zeroCreate (List.length urls)
let chunks =
urls
|> Seq.chunkBySize limit
|> Seq.indexed
async.For (chunks, fun (i, chunk) ->
chunk
|> Seq.map asyncMockup
|> Async.Parallel
>>- Seq.iteri (fun j r -> results.[i*limit+j]<-r))
>>- fun _ -> results

Grigoriy
09.10.2018
17:44:55
если сортирнуть по убыванию размера файлов то ожиданий неполных чанков должно быть поменьше

Ayrat
09.10.2018
17:45:52
вот пул воркеров на гопаке упакованный в класс
https://gist.github.com/Szer/e9039e19c407a496efde44126c349626
для продакшна там есть другая версия

Grigoriy
09.10.2018
17:47:10
GetFiles: string -> string []

Ayrat
09.10.2018
17:48:56

Google

Grigoriy
09.10.2018
17:51:15
я только не понимаю, как сохраняется параллелизм при недостатке асинков в чанке?

Ayrat
09.10.2018
17:52:52
в гопак варианте очень даже
чанки потому и говно что ты ждёшь весь чанк

Grigoriy
09.10.2018
17:53:15
да

Ayrat
09.10.2018
17:53:25
и если там один запрос в таймаут попадёт, то бида
вот смотри гопачок!
let rec loop usage degree =
degreeCh ^=> loop usage
<|> doneCh ^=> (function
| Choice1Of2 x -> Src.value goodOutput x
| Choice2Of2 e -> Src.value badOutput e
>=> fun _ -> loop (usage - 1) degree)
<|> if usage < degree then
inputCh ^=> (worker
>> Job.catch
>=> Ch.give doneCh
>> Job.queue
>=> fun _ -> loop (usage + 1) degree)
else Alt.never()
кстати - ракета/рыба присутствует

Grigoriy
09.10.2018
17:54:18

Ayrat
09.10.2018
17:54:36
хотя там уже все джобы отработали
семеро одного ждут

Grigoriy
09.10.2018
17:54:51
Воробушек покакал :)
мне ж ещё на пальцах коллегам объяснять

Ayrat
09.10.2018
17:55:30
а вот в гопак варианте!!1 даже отдельные аутпуты есть для плохих и хороших окончаний. Т.е. снаружи можно принимать решения о ретрае
и аутпуты в виде стримов, т.е. можешь их далее как хочешь насиловать
короче, одни бонусы

Google

Ayrat
09.10.2018
17:57:25
а да, ещё он динамически скалируемый) т.е. можно прям на ходу добавлять убавлять параллелизма
как тебе такое, Илон Маск?

Grigoriy
09.10.2018
17:57:41
надо курнуть сначала!

Ayrat
09.10.2018
17:57:52
выпить!

Grigoriy
09.10.2018
17:58:14
И немедленно выпил. (с)
я подожду видосика твоего доклада... послушаю, помедитирую... и потом... :)

Ayrat
09.10.2018
18:01:26

Grigoriy
09.10.2018
18:02:03
пока что это выше моего уровня компетенции
AsyncSeq я ещё хоть как-то понимаю
Сортировка по убыванию размера сократила время аплоада на 20%
решил остановиться :)

Kinrany
09.10.2018
21:05:08
Немного оффтопик: посоветуйте почитать короткий и language-agnostic список концепций, связанных с абстрактными вычислительными процессами? От чисел и бит информации до всяких реактивных потоков и свободных монад?

Grigoriy
09.10.2018
21:14:42

Vasily
09.10.2018
21:15:35
По фри монадам у Марка Симана есть статьи
Правда, они не отвязаны от языка

Grigoriy
09.10.2018
21:15:55
и у DeGoes'a

Vasily
09.10.2018
21:16:44
Ну да
По реактивщине хз
Эрик Мейер
Вроде это все педалировал и писал пейперы

Google

Grigoriy
09.10.2018
21:17:55
Мейер так ваще RxLib написал, которую на все языки мира портировали

Kinrany
09.10.2018
21:19:24
Пожалуй, я ищу именно список: про что-то конкретное найти информацию несложно, если знать, что искать. Хочется обзор идей, на которые случайно можно и не наткнуться
Сам из такого нашёл "Concepts, Techniques, and Models of Computer Programming", но это целая толстая книга на несколько семестров

Vasily
09.10.2018
21:28:36
Ну я не слышал про список идей
Это ж не матан

Kinrany
09.10.2018
21:47:29
Нуууу
Очень близко к абстрактной алгебре, разве нет? :D

Grigoriy
09.10.2018
21:47:57
@vshapenko Я тут ща запилил эту хрень, про которую ранее спрашивал совета, как отдельный нугет - с репкой, билдом и паблишом пэкеджа в VSTS Artifacts feed

Нина
10.10.2018
03:53:49
Ребят, а на F# вообще можно как-то относительно эффективно, но идиоматично для фп, реализовать перестановку бит числа по таблице? Или мне стоит бросить эту идею и писать это на C#? Там это, понятное дело, пять строк...

Grigoriy
10.10.2018
03:56:14
По какой таблице? :)

Нина
10.10.2018
04:00:44
Произвольной таблице, которая задаёт соответствие позиций битов результата битам исходного значению. В общем, я лучше покажу, как это у меня сейчас реализовано, минутку...
https://pastebin.com/R975UC3n

Grigoriy
10.10.2018
04:05:30
Ну, цикл - рекурсия
Битовые операции есть
Хм. Там вообще можно свёрткой по «таблице» сделать
foldBack

Нина
10.10.2018
04:08:48
Логично. Я об этом даже как-то не подумала.

Grigoriy
10.10.2018
04:50:52
@VVatashi как успехи? :)

Нина
10.10.2018
04:53:02
Ну, вот к чему я пришла: https://pastebin.com/UpAuYevk