Asio+Fibers

Тема в разделе "WASM.NETWORKS", создана пользователем superakira, 22 мар 2017.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну как дела? :)
     
  2. superakira

    superakira Guest

    Публикаций:
    0
    _DEN_, yo
    Ситуация такова, что пока нет. Очень много другого и пока в списке приоритетных задач это отъехало минимум на полгода. Есть еще одна история - это то как мэйнтениться асио. Если глянуть гитхаб, то не радует по сравнению с конкурентами. Так что пока я в раздумье - стоит ли такой эксперимент мутить на асио с точки зрения перспективы в дальгейшем. Такие дела, сорри что не обрадовал инфой
     
  3. superakira

    superakira Guest

    Публикаций:
    0
    Таки протестил... мне не понравилось. Те явного ускорения я не увидел + есть беда в связке асио и фиберов. Там прикол, что есть ограничение - при таком подходе нелья сделать пулл потоков (раннить иосервис на несколько потоков) - так как фибер привязан к конкретному потоку, а в асио нет гарантии на каком потоке будет следующий хэндлер выполнен из очереди. Те это официальное орграничение, пока автор занят и не будет это разруливать. Но так принципиально работает. Пока еще для продакшена рановато.
    В этом плане как ни странно крут голанг... там прям все по православному в этом плане, но пока нету время переводить на него и не факт, что есть смысл.... может новое потом на нем буду.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А зачем такая гарантия? Ведь fibers / coroutines не требуют однопоточности? Каждый последующий возврат к исполнению может происходит в любом другом треде. Здесь вопрос лишь в том, каким образом мы работаем с (общими) данными изнутри coroutine. То есть - это вопрос приложения, а не библиотеки. Или я чего-то не понимаю?
     
    Последнее редактирование: 2 дек 2017
  5. f1redArk

    f1redArk Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Вы все верно написали.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    И снова здравствуйте. Надеюсь ты еще тут. Суть драмы: автор Boost.Beast поясняет за модели мультитрединга при работе с Boost.Asio на CppCon 2018. Полное видео про Beast: youtu.be/7FQwAjELMek, конкретно наш вопрос: youtu.be/7FQwAjELMek?t=1341, и вот чувак утверждает, что 1 тред = 1 io_context - это быстрее, чем N тредов в 1 io_context. Как тебе такое, Илон Маск? Что думаешь?

    PS. порезал ссылки потому что форум парсит это в инлайн видео, и теряет смещение по времени.
     
  7. superakira

    superakira Guest

    Публикаций:
    0
    _DEN_, хай. пока еще тут.
    thnx посмотрю. но вообще я решил для себя в таком ключе по сетям -
    лютый хайлоад - seastar (в перспективе)
    остальное на go - у меня и он вывозит норм кстати.

    по асио - там ввели корутины почти уже. в пропозалах и почти как мне надо. но у меня пока все вывозит и так.
    замонала только асинхронность. вложенные лямбды не сильно упрощают чтение. сложную стэй-машину на колбаках держать в голове - это боль.
     
  8. f1redArk

    f1redArk Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    34
    Есть же boost::spawn давно, и т п
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А не надо делать их вложенными :) Должно быть так: функция постановки задачи, в которой прописана лямбда комплишена, который вызывает другую аналогичную функцию:

    Код (C++):
    1. session::async_some_step1()
    2. {
    3.     socket.async_read(..., [&] (error_code ec)
    4.     {
    5.         async_some_step2();
    6.     });
    7. }
    8.  
    9. session::async_some_step2()
    10. {
    11.     socket.async_write(..., [&] (error_code ec)
    12.     {
    13.         if(...)
    14.         {
    15.             async_some_step3();
    16.         }
    17.         else
    18.         {
    19.             async_some_step4();
    20.         }
    21.     });
    22. }
    Таким образом у тебя получается плоский список одноэтажных асинк-функций, и граф переходов между ними. Одна функция - один этаж лямбд. И весь процесс в голове держать не надо. Достаточно посмотреть на каждую "вершину графа" по отдельности, и оценить, правильно ли из него выходят "ребра".
     
    Последнее редактирование: 13 ноя 2018