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

Ievgenii
07.01.2018
10:17:02

Google

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

Ievgenii
07.01.2018
10:17:45

Evgeny
07.01.2018
10:18:08

Ievgenii
07.01.2018
10:18:09

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

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
Ну а все таки на каком языке? А то что-то я сомневаюсь, вопросы то "новичковые".

Ievgenii
07.01.2018
10:39:58

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
Вот например спросил
А это, говорит о узкости твоего кругозора. Т.к. это я писал о биндинге сокета. И я не вижу и сейчас необходимости биндинге именно в файбере)))

Evgeny
07.01.2018
10:47:43

Ievgenii
07.01.2018
10:48:10
7 штук
И склеить их ответы
Ждать не 1 файб, а 7
Смекаешь? © Джек Воробей

Evgeny
07.01.2018
10:49:57
можешь обернуть создание файбера в примитивную функцию в одно строку

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);
не знаю есть оно в вайбе или нет

Ievgenii
07.01.2018
11:11:00
Это не асинхронно
Конечно, оно сделает именно то, что ты хочешь, но...

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

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

Google

Evgeny
07.01.2018
11:19:22
Забавный ты)
Ну может ты и правда не знаешь. В этом нет ничего плохого. Не знаешь - узнай!

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

Ievgenii
07.01.2018
11:22:01

Evgeny
07.01.2018
11:22:23

Ievgenii
07.01.2018
11:22:52

Evgeny
07.01.2018
11:23:02

Ievgenii
07.01.2018
11:23:14
Как-то так

Igor
07.01.2018
11:24:09
waitAny

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

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

Ievgenii
07.01.2018
11:26:29

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

Ievgenii
07.01.2018
11:26:56
В файберах - нет