На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (245) « Первая ... 137 138 [139] 140 141 ...  244 245  ( Перейти к последнему сообщению )  
> Есть ли будущее у DELPHI?
    Цитата MyNameIsIgor @
    Вы не поверите, но...

    ну как отличить тут асинхронную операцию от синхронной?
      Цитата jack128 @
      Цитата MyNameIsIgor @
      Вы не поверите, но...

      ну как отличить тут асинхронную операцию от синхронной?

      А это здесь и не нужно. Можно даже сказать, что здесь только синхронные операции. Но они блокируют контекст (fiber для виндовых программистов) на то время, что GetBoolAsync будет делать запрос к СУБД, писать в файл и прочее. Но при этом поток ОС не блокируется и спокойненько делает другую работу. При этом никакого изменения языка. И таки да, исключения летают нормально, а не "как смогла" из async-функций C#.
      Сообщение отредактировано: MyNameIsIgor -
        MyNameIsIgor, так event-driven + coroutines, не? Так сейчас частенько делают на сях(libevent + велосипеды или другие либы) и на питончике(gevent, например). Или ты про что-то другое?

        Добавлено
        Цитата D_KEY @
        Так сейчас частенько делают

        Я имел в виду не windows-сообщество. У них какие-то свои тенденции :D
          Цитата D_KEY @
          MyNameIsIgor, так event-driven + coroutines, не?

          Да-да, сопрограммы - ключевое слово. Но вызов функции по событию - это не то, это как раз asio style. А я говорю про boost.task style. Кстати, автор последнего Oliver Kowalke, как я понимаю, втаскивает в boost его зависимости - contex втащил, по coroutine идёт голосовалка и нет причин ей провалиться, а там уже и саму task можно коммитеть. В сочетании с asio этот будет очень крутая штука на серваке, imho - полностью синхронный код, работающий асинхронно, а не этот Node.js в исполнении мелких и мягких.
          Сообщение отредактировано: MyNameIsIgor -
            Цитата MyNameIsIgor @
            Но они блокируют контекст (fiber для виндовы программистов)

            c фиберами не работал, сейчас бегло почитал, не понял как ты на этих фиберах заставишь работать обсуждаемый цикл. вот пусть функция GetBoolAsync - это один фибер, DoWorkAsync - это второй фибер, а сам цикл while - это что? третий фибер? GetBool/DoWork как то должны ему передовать управление? откуда они знают куда нужно управление передовать?
              Вот, кстати, то, как выглядит WinRT - это Node.js, а легковесные потоки - это Erlang.
                Цитата MyNameIsIgor @
                Да-да, сопрограммы - ключевое слово. Но вызов функции по событию - это не то, это как раз asio style. А я говорю про boost.task style. Кстати, автор последнего Oliver Kowalke, как я понимаю, втаскивает в boost его зависимости - contex втащил, по coroutine идёт голосовалка и нет причин ей провалиться, а там уже и саму task можно коммитеть. В сочетании с asio этот будет очень крутая штука на серваке, imho - полностью синхронный код, работающий асинхронно, а не этот Node.js в исполнении мелких и мягких.

                Ну если втащат, то попробуем :) В смысле уже можно будет для работы попытаться использовать, а не просто играться.
                  Цитата jack128 @
                  c фиберами не работал, сейчас бегло почитал

                  Это очень жаль...
                  Цитата jack128 @
                  не понял как ты на этих фиберах заставишь работать обсуждаемый цикл. вот пусть функция GetBoolAsync - это один фибер, DoWorkAsync - это второй фибер, а сам цикл while - это что? третий фибер?

                  Нет. Это всё один контекст (fiber).
                  Вот как сейчас происходит. Этот await всё за ним заключает в лямбду и пихает полученному из асинхронной функции. Эту лямбду вызывает пул потоков.

                  Для легковесных потоков мы оставляем этот пул, например, по количеству ядер/процессоров в системе. Вызовы тех функций, что сейчас асинхронные, запускают асинхронный ввод/вывод и переключают контекст (fiber). Таким образом они, в отличие от await, не возвращают управление пока операция не закончится, но в этом же потоке исполняется уже другой контекст (fiber).

                  Добавлено
                  Цитата D_KEY @
                  Ну если втащат, то попробуем В смысле уже можно будет для работы попытаться использовать, а не просто играться.

                  Ну, можно у niXman'а спросить. Эта либа ему ещё в 2010-ом понравилась.

                  Добавлено
                  jack128, отредактировал пост, а то напутал там асинхронные функции с async аннотациями C#.
                  Сообщение отредактировано: MyNameIsIgor -
                    Цитата MyNameIsIgor @
                    А я говорю про boost.task style.

                    по ссылке я что то не увидел, как продолжить асинхронную задачу.

                    ExpandedWrap disabled
                      void ExternalRequest(const std::string & what) const
                      {
                        ExternalRequestHandler external_handler(io_service_);
                        boost::tasks::spin::auto_reset_event ev;
                        external_handler.PerformExternalReqeust(what, &ev);
                        ev.wait(); // это не интересно!!!.
                      }
                    Сообщение отредактировано: jack128 -
                      Цитата jack128 @
                      ExpandedWrap disabled
                        ev.wait(); // это не интересно!!!.

                      Тудыж твою! Как раз это и интересно! Простите, но ваш мозг испорчен колбэками...
                      Исполнение продолжится само когда закончится асинхронное исполнение и пул опять перключится на наш контекст. Там же написано
                      Цитата
                      Это событие передается обработчику внешнего запроса и по его завершению будет вызвано ev.set(), а до тех пор ev.wait() блокирует задачу.
                      В противовес обычным потокам и примитивам синхронизации (boost::condition) ev.wait() не блокирует поток, а блокирует задачу (вызывает в цикле this_task::yield()). А это значит, что ресурсы процессора будут использованы другими задачами.
                        Цитата MyNameIsIgor @
                        Вызовы тех функций, что сейчас асинхронные, запускают асинхронный ввод/вывод и переключают контекст (fiber).

                        А кто будет назад возвращать контекст? по идее когда у нас завершиться асинхронный IO, должен будет сработать некий код который вернет контекст обратно. Этот код кем будет выполняться? Пулом?

                        И еще вопрос. В предложенной MS схеме я могу написать так:

                        var content1 = await File.ReadAllTextAsync('myfile1');
                        var content2 = await File.ReadAllTextAsync('myfile2');

                        а могу так:

                        var contents = await Task.WaitAll(File.ReadAllTextAsync('myfile1'), File.ReadAllTextAsync('myfile2'));

                        как второй вариант реализуется в твоей схеме ?

                        Добавлено
                        Цитата MyNameIsIgor @
                        Там же написано

                        а. понятно. это я пропустил. Ладно, уже поздно, мозги не работают, завтра продолжем, если не возражаешь.
                          Цитата jack128 @
                          А кто будет назад возвращать контекст? по идее когда у нас завершиться асинхронный IO, должен будет сработать некий код который вернет контекст обратно. Этот код кем будет выполняться? Пулом?

                          Ну, вот в статье про boost.task для асинхронных операций используется boost.asio. Он устанавливает ивент и пул узнаёт какие контексты готовы к возобновлению исполнения.
                          Естественно, надо понимать, что task и asio - это основание. В таком API, как WinRT, функции чтения/записи файла/сокета должны и добавлять задачи в пул, и ставить обработчики в asio - все эти потроха скрыты.
                          Цитата jack128 @
                          И еще вопрос. В предложенной MS схеме я могу написать так:

                          var content1 = await File.ReadAllTextAsync('myfile1');
                          var content2 = await File.ReadAllTextAsync('myfile2');

                          а могу так:

                          var contents = await Task.WaitAll(File.ReadAllTextAsync('myfile1'), File.ReadAllTextAsync('myfile2'));

                          как второй вариант реализуется в твоей схеме ?

                          Да ну так же. По ссылке же есть. ReadAllTextAsync возвращает нечто, удовлетворяющее концепции future, т.е. постит новую задачу. У чувака в статье такой пример
                          ExpandedWrap disabled
                            boost::tasks::handle< void > subtask1(
                                boost::tasks::async(
                                  boost::tasks::make_task( &RequestHandler::Subtask1, this )));
                              boost::tasks::handle< void > subtask2(
                                boost::tasks::async(
                                  boost::tasks::make_task( &RequestHandler::Subtask2, this )));
                             
                              boost::tasks::waitfor_all( subtask1, subtask2);


                          Добавлено
                          Цитата jack128 @
                          в твоей схеме

                          И да, это, конечно, не моя схема. Сопрограммам и переключению контекстов сто лет в обед.
                          Сообщение отредактировано: MyNameIsIgor -
                            Цитата jack128 @
                            В предложенной MS схеме я могу написать так:

                            var content1 = await File.ReadAllTextAsync('myfile1');
                            var content2 = await File.ReadAllTextAsync('myfile2');

                            а могу так:

                            var contents = await Task.WaitAll(File.ReadAllTextAsync('myfile1'), File.ReadAllTextAsync('myfile2'));


                            А в чем будет разница?
                              Цитата korvin @
                              А в чем будет разница?

                              В первом случае чтение myfile2 не начнётся пока не закончится чтение myfile1. Во втором чтение будет параллельным.
                                Цитата MyNameIsIgor @
                                В первом случае чтение myfile2 не начнётся пока не закончится чтение myfile1. Во втором чтение будет параллельным.

                                эм... А в чем тогда в первом случае будет заключаться асинхронность? Иными словами: почему там нельзя простые функции вызвать?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (245) « Первая ... 137 138 [139] 140 141 ...  244 245


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1482 ]   [ 15 queries used ]   [ Generated: 22.12.25, 16:45 GMT ]