Есть ли будущее у DELPHI?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.43] |
|
|
Правила раздела:
| Страницы: (245) « Первая ... 137 138 [139] 140 141 ... 244 245 ( Перейти к последнему сообщению ) |
Есть ли будущее у DELPHI?
|
Сообщ.
#2071
,
|
|
|
|
ну как отличить тут асинхронную операцию от синхронной? |
|
Сообщ.
#2072
,
|
|
|
|
Цитата jack128 @ ну как отличить тут асинхронную операцию от синхронной? А это здесь и не нужно. Можно даже сказать, что здесь только синхронные операции. Но они блокируют контекст (fiber для виндовых программистов) на то время, что GetBoolAsync будет делать запрос к СУБД, писать в файл и прочее. Но при этом поток ОС не блокируется и спокойненько делает другую работу. При этом никакого изменения языка. И таки да, исключения летают нормально, а не "как смогла" из async-функций C#. |
|
Сообщ.
#2073
,
|
|
|
|
MyNameIsIgor, так event-driven + coroutines, не? Так сейчас частенько делают на сях(libevent + велосипеды или другие либы) и на питончике(gevent, например). Или ты про что-то другое?
Добавлено Цитата D_KEY @ Так сейчас частенько делают Я имел в виду не windows-сообщество. У них какие-то свои тенденции |
|
Сообщ.
#2074
,
|
|
|
|
Цитата D_KEY @ MyNameIsIgor, так event-driven + coroutines, не? Да-да, сопрограммы - ключевое слово. Но вызов функции по событию - это не то, это как раз asio style. А я говорю про boost.task style. Кстати, автор последнего Oliver Kowalke, как я понимаю, втаскивает в boost его зависимости - contex втащил, по coroutine идёт голосовалка и нет причин ей провалиться, а там уже и саму task можно коммитеть. В сочетании с asio этот будет очень крутая штука на серваке, imho - полностью синхронный код, работающий асинхронно, а не этот Node.js в исполнении мелких и мягких. |
|
Сообщ.
#2075
,
|
|
|
|
Цитата MyNameIsIgor @ Но они блокируют контекст (fiber для виндовы программистов) c фиберами не работал, сейчас бегло почитал, не понял как ты на этих фиберах заставишь работать обсуждаемый цикл. вот пусть функция GetBoolAsync - это один фибер, DoWorkAsync - это второй фибер, а сам цикл while - это что? третий фибер? GetBool/DoWork как то должны ему передовать управление? откуда они знают куда нужно управление передовать? |
|
Сообщ.
#2076
,
|
|
|
|
Вот, кстати, то, как выглядит WinRT - это Node.js, а легковесные потоки - это Erlang.
|
|
Сообщ.
#2077
,
|
|
|
|
Цитата MyNameIsIgor @ Да-да, сопрограммы - ключевое слово. Но вызов функции по событию - это не то, это как раз asio style. А я говорю про boost.task style. Кстати, автор последнего Oliver Kowalke, как я понимаю, втаскивает в boost его зависимости - contex втащил, по coroutine идёт голосовалка и нет причин ей провалиться, а там уже и саму task можно коммитеть. В сочетании с asio этот будет очень крутая штука на серваке, imho - полностью синхронный код, работающий асинхронно, а не этот Node.js в исполнении мелких и мягких. Ну если втащат, то попробуем В смысле уже можно будет для работы попытаться использовать, а не просто играться. |
|
Сообщ.
#2078
,
|
|
|
|
Цитата jack128 @ c фиберами не работал, сейчас бегло почитал Это очень жаль... Цитата jack128 @ не понял как ты на этих фиберах заставишь работать обсуждаемый цикл. вот пусть функция GetBoolAsync - это один фибер, DoWorkAsync - это второй фибер, а сам цикл while - это что? третий фибер? Нет. Это всё один контекст (fiber). Вот как сейчас происходит. Этот await всё за ним заключает в лямбду и пихает полученному из асинхронной функции. Эту лямбду вызывает пул потоков. Для легковесных потоков мы оставляем этот пул, например, по количеству ядер/процессоров в системе. Вызовы тех функций, что сейчас асинхронные, запускают асинхронный ввод/вывод и переключают контекст (fiber). Таким образом они, в отличие от await, не возвращают управление пока операция не закончится, но в этом же потоке исполняется уже другой контекст (fiber). Добавлено Цитата D_KEY @ Ну если втащат, то попробуем В смысле уже можно будет для работы попытаться использовать, а не просто играться. Ну, можно у niXman'а спросить. Эта либа ему ещё в 2010-ом понравилась. Добавлено jack128, отредактировал пост, а то напутал там асинхронные функции с async аннотациями C#. |
|
Сообщ.
#2079
,
|
|
|
|
Цитата MyNameIsIgor @ А я говорю про boost.task style. по ссылке я что то не увидел, как продолжить асинхронную задачу. ![]() ![]() 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(); // это не интересно!!!. } |
|
Сообщ.
#2080
,
|
|
|
|
Цитата jack128 @ ![]() ![]() ev.wait(); // это не интересно!!!. Тудыж твою! Как раз это и интересно! Простите, но ваш мозг испорчен колбэками... Исполнение продолжится само когда закончится асинхронное исполнение и пул опять перключится на наш контекст. Там же написано Цитата Это событие передается обработчику внешнего запроса и по его завершению будет вызвано ev.set(), а до тех пор ev.wait() блокирует задачу. В противовес обычным потокам и примитивам синхронизации (boost::condition) ev.wait() не блокирует поток, а блокирует задачу (вызывает в цикле this_task::yield()). А это значит, что ресурсы процессора будут использованы другими задачами. |
|
Сообщ.
#2081
,
|
|
|
|
Цитата 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 @ Там же написано а. понятно. это я пропустил. Ладно, уже поздно, мозги не работают, завтра продолжем, если не возражаешь. |
|
Сообщ.
#2082
,
|
|
|
|
Цитата 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, т.е. постит новую задачу. У чувака в статье такой пример ![]() ![]() 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 @ в твоей схеме И да, это, конечно, не моя схема. Сопрограммам и переключению контекстов сто лет в обед. |
|
Сообщ.
#2083
,
|
|
|
|
Цитата 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')); А в чем будет разница? |
|
Сообщ.
#2084
,
|
|
|
|
Цитата korvin @ А в чем будет разница? В первом случае чтение myfile2 не начнётся пока не закончится чтение myfile1. Во втором чтение будет параллельным. |
|
Сообщ.
#2085
,
|
|
|
|
Цитата MyNameIsIgor @ В первом случае чтение myfile2 не начнётся пока не закончится чтение myfile1. Во втором чтение будет параллельным. эм... А в чем тогда в первом случае будет заключаться асинхронность? Иными словами: почему там нельзя простые функции вызвать? |