@dlangru

Страница 370 из 719
Evgeny
07.01.2018
10:13:48
Но не понятно, для чего делать колбек, для таких целей
Ну так сделано в вайбе. Не лучшее на мой взгляд решение. Но простое и работает. Это проще, чем городить рендж и возвращать его.

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

На вайбе писать очень легко и просто сложное параллельное IO, на эвентах получается адская лапша.

Google
Evgeny
07.01.2018
10:17:28
Ну а начем работает твой libev или что ты там собрался использовать?

Ievgenii
07.01.2018
10:17:45
На вайбе писать очень легко и просто сложное параллельное IO, на эвентах получается адская лапша.
Ивенты все равно придется использовать, если хочешь делать компонентность/модульность, с минимальной связанностью

Evgeny
07.01.2018
10:19:28
допустим у тебя сто файберов ждут ответа от разных источников. Ядро принимает ивенты о прибытии данных, само будит нужный файбер и передает ему эти данные.

вайбовские таски могут ожидать не только IO, но и чего угодно, сообщений от других тасков или вообще каких-нибудь твоих собственных условий.

Ты на каком языке кроме D пишешь? Я попробую тебе аналоги подобрать.

допустим у тебя сто файберов ждут ответа от разных источников. Ядро принимает ивенты о прибытии данных, само будит нужный файбер и передает ему эти данные.
Причем для файбера это выглядит просто как блокирующая операция. Это очень сильно облегчает написание кода. Синхронное оно кагбэ всегда проще асинхронного.

А боятся засрать систему тучей файберов не надо. На то они и файберы. Их, в отличие от потоков, можно спавнить тоннами.

Igor
07.01.2018
10:25:00
если не ошибаюсь, с файберами есть один нюанс - размер стека. в 64битах можно в принципе ставить любой размер, но в 32-х уже довольн тесно и нужно следить что там у тебя в стеке

кроме того переключение файберов конечно легче чем переключение тредов, но все-равно не бесплатное

Evgeny
07.01.2018
10:26:41
если не ошибаюсь, с файберами есть один нюанс - размер стека. в 64битах можно в принципе ставить любой размер, но в 32-х уже довольн тесно и нужно следить что там у тебя в стеке
Да, есть такой косяк. Я и в 64 битах ограничиваю. На рабочей системе я вырубил избыточное выделение памяти и, соответственно, OOM-киллер.

Google
Evgeny
07.01.2018
10:27:44
Оверхед реально маленький. Даже на МК часто используются аналоги.

Кстати кому еще, кроме древних систем нужны 32-бита?

Разве что embedded системы с огранниченными ресурсами

Igor
07.01.2018
10:31:30
периодически на форуме кто-то пишет о сових проблемах на 32 битах, то есть кто-то использует

не знаю зачем честно говоря

на 32 битах и GC криво работает

Evgeny
07.01.2018
10:36:14
да, на 32 битах течет сильнее

ИМХО все новые приложения уже давно должны писаться на 64-бита

Ievgenii
07.01.2018
10:38:30
Evgeny
07.01.2018
10:39:19
Ну а все таки на каком языке? А то что-то я сомневаюсь, вопросы то "новичковые".

Evgeny
07.01.2018
10:40:31
Какие вопросы?
Да вот даже предыдущий :)

Ievgenii
07.01.2018
10:40:32
Зачем колбеки, если есть имитация синхронности?)))

Да вот даже предыдущий :)
Потому, что я не вижу в этом необходимости

Evgeny
07.01.2018
10:41:01
Или "зачем нужны файберы для IO?"

Ievgenii
07.01.2018
10:41:18
Evgeny
07.01.2018
10:41:25
Потому, что я не вижу в этом необходимости
Ну это говорит всего лишь об узости твоего личного кругозора.

Ievgenii
07.01.2018
10:41:53
Ну это говорит всего лишь об узости твоего личного кругозора.
Ну как скажешь. Просто я знаю как это сделать без таких костылей.

Вот и все

Google
Evgeny
07.01.2018
10:43:42
И зачем это делать в файбе?
Вот например спросил

Ну как скажешь. Просто я знаю как это сделать без таких костылей.
Это не костыли. А сделать можно и вовсе на ассемблере и объявить все языки костылями. ?

Ievgenii
07.01.2018
10:44:47
Я и пример то с 7ю внешними запросами приводил, т.к. для этого не нужно руками стартовать 7 файберов и писать их ожидание...

Evgeny
07.01.2018
10:45:24
Нужно например сделать 10 запросов и протом склеить ответы один большой ответ.

Ievgenii
07.01.2018
10:46:07
Вот например спросил
А это, говорит о узкости твоего кругозора. Т.к. это я писал о биндинге сокета. И я не вижу и сейчас необходимости биндинге именно в файбере)))

Нужно например сделать 10 запросов и протом склеить ответы один большой ответ.
Я о том, что нет нормальной конструкции для этого! Которая имеется в тех же Обещаниях

Evgeny
07.01.2018
10:47:43
Ievgenii
07.01.2018
10:48:10
7 штук

И склеить их ответы

Ждать не 1 файб, а 7

Смекаешь? © Джек Воробей

Evgeny
07.01.2018
10:49:57
А это, говорит о узкости твоего кругозора. Т.к. это я писал о биндинге сокета. И я не вижу и сейчас необходимости биндинге именно в файбере)))
Причем тут кругозор? Скорее может на так понял. Но я тоже не говорил о биндинге, а говорил о выполнении запроса

Ждать не 1 файб, а 7
Ну а как ты собрался параллельно делать 7 запросов?

можешь обернуть создание файбера в примитивную функцию в одно строку

Ievgenii
07.01.2018
11:00:29
Как продолжить выполнение своего файбера, когда получишь ответ на все 7 запросов?

Которые желательно выполнить паралельно

Evgeny
07.01.2018
11:02:26
Например вот так: auto resp1 = async({ return requestHTTP("...").readAllUTF8(); }); auto resp2 = async({ return requestHTTP("...").readAllUTF8(); }); string result = resp1.getResult() ~ resp2.getResult();

тут два запроса выполняются параллеьно и склеивается результат

Google
Evgeny
07.01.2018
11:03:34
сами запросы будут выполнены внутри двух файберов.

а теперь тоже самое пожалуйста на голых сокетах и libev ?

Более низкоуровневый вариент: Task[] taskPool; taskPool ~= runTask({ // задача 1 }); taskPool ~= runTask({ // задача 2 }); // ждем выполнения всех задач foreach(task; taskPool) task.wait(); // продолжаем работу

Igor
07.01.2018
11:09:14
или даже что-то типа auto results = waitAll(taskPool); не знаю есть оно в вайбе или нет

Admin
ERROR: S client not available

Evgeny
07.01.2018
11:12:19
Ты сперва ждёшь первый, потом второй и так далее
Ты же попросил дождаться выполнения ВСЕХ файберов, как еще-то делать?

Кстати, так как runTask запускает файберы в том же потоке, что и запускающий файбер, то можно делать вот так без race conditions: Task[] taskPool; Result[] results; taskPool ~= runTask({ // задача 1 results ~= result; }); taskPool ~= runTask({ // задача 2 results ~= result; }); // ждем выполнения всех задач foreach(task; taskPool) task.wait(); // продолжаем работу

Ievgenii
07.01.2018
11:15:44
Тебе кажется. Он рабочий.
Да, скорее всего. Там гетРезалт реализует удержание, видимо

Evgeny
07.01.2018
11:17:34
async возвращает future, если ты знаешь, что это такое. Если не знаешь то вот - https://ru.wikipedia.org/wiki/Futures_and_promises

Dmitry
07.01.2018
11:18:45
Кстати кому еще, кроме древних систем нужны 32-бита?
У меня прога 32-битная, т.к. использует 200+ плагинов, написанных третьими лицами за много лет, и плагины те почти все 32-битные.

Ievgenii
07.01.2018
11:18:50
Да, более не менее просто дожидаться всех. А одного из?

Google
Ievgenii
07.01.2018
11:20:10
Один из 7

Произвольный

Evgeny
07.01.2018
11:20:36
что значит произвольный? рандомный что-ли?

Ievgenii
07.01.2018
11:20:47
Ну может ты и правда не знаешь. В этом нет ничего плохого. Не знаешь - узнай!
Читай выше. Я о Обещаниях писал. Что там это реализуется просто

Делаешь 7 запросов. Как только получаешь ответ от одного - продолжить выполнение

Не все ждёшь, а один из

Evgeny
07.01.2018
11:21:27
Читай выше. Я о Обещаниях писал. Что там это реализуется просто
Ну мало ли что ты пишешь. Если знаешь то молодей. Я же не сказал, что ты не знаешь. Я на всякий случай.

Evgeny
07.01.2018
11:22:23
Вот я и написал, что ты забавный)))
Я рад, что тебе весело :)

Ievgenii
07.01.2018
11:22:52
Я рад, что тебе весело :)
О, мне всегда весело

Evgeny
07.01.2018
11:23:02
Делаешь 7 запросов. Как только получаешь ответ от одного - продолжить выполнение
То есть ты хочешь дождаться того кто первый сделал свой запрос и продолжить дальше?

Igor
07.01.2018
11:24:09
waitAny

Evgeny
07.01.2018
11:24:10
Это реализуемо чуть сложнее, полагаю тут тебе промисы тоже не помогут. Но я могу накидать код с применением пересылки сообщений между файберами. Заодно узнаешь зачем оно нужно, ты же спрашивал.

Igor
07.01.2018
11:26:15
под капотом это всё-равно делается с помощью колбэков. для ожидания “любого” все задачи выставляются на такой колбэк кторый просто завершает ожидание

Igor
07.01.2018
11:26:41
как только калбэк сработал двигаемся дальше

Страница 370 из 719