2013-10-04 3 views
0

Понятно, что я не разбираюсь в «асинхронных» средах (таких как NodeJS) и «синхронных».Насколько легко подделывать асинхронность?

Предположим, вы оказались в ловушке синхронной среды. Не могу ваш главный цикл просто сказать:

while(1) { 
events << check_for_stuff_from_the_outside_world(); 
for e in events {e.process()} 
} 

Что с делать это, как то, что не является асинхронной среда, как асинхронные среды отличаются?

+0

'check_for_stuff_from_the_outside_world()' выполняет рутину над довольно массивной проблемой, как это сделать для a) любого количества источников событий; б) более одного вида источника событий; c) без блокировки, когда одному источнику событий ничего не сообщается. – millimoose

+0

Не будет ли это потреблять ненужные циклы процессора или, что еще хуже, заблокировать поток? – James

+0

И хотя вы могли бы представить себе унифицирующую конструкцию для обработки любых событий из любого типа неблокирующего источника, это сделало бы 'e.process()' очень неуклюжим - для начала вам нужно было бы проверить событие для своего источника и тип и отправку в соответствующий обработчик, и вы в конечном итоге получите такой же ужасный дизайн, как SAX. Теперь Node.JS является довольно неуклюжим (ему действительно нужно 'async ..ждут «knockoff»), но он по-прежнему приводит к несколько более естественному коду, который позволяет вам четко выразить поток данных между асинхронными входами и их обработчиками. – millimoose

ответ

2

Да, это более или менее то, что делает Node.js, за исключением того, что вместо check_for_stuff_from_the_outside_world() оно должно быть действительно check_for_stuff_from_the_outside_world_plus_follow_on_stuff_from_previous_events(); и все ваши события также должны быть написаны таким образом, чтобы вместо завершения их обработки они просто выполняли кучу своей работы, а затем вызывали register_stuff_for_follow_up(follow_on_event). Другими словами, вам действительно нужно написать все вашего кода, чтобы взаимодействовать с этим фреймворком событий; это невозможно сделать «прозрачно», и только основной цикл должен беспокоиться об этом.

Это большая часть того, почему Node.js - это JavaScript; на большинстве языков есть уже существующие стандартные библиотеки (для ввода-вывода и т. д.), которые не построены поверх асинхронных фреймворков. JavaScript относительно необычен, ожидая, что каждая среда хостинга предоставит библиотеку, соответствующую ее собственным целям (например, «стандартная библиотека» браузера JS может иметь почти ничего общего с «стандартной библиотекой» среды JS командной строки, такой как как SpiderMonkey), что дало Node.js гибкость в разработке библиотек, которые работали вместе со своим циклом событий.

0

Посмотрите на пример на странице Википедии: https://en.wikipedia.org/wiki/Nodejs#Examples

Обратите внимание, как код действительно сосредоточены на функциональности сервера - что он должен делать. Node.js в основном говорит: «Дайте мне возможность для того, что вы хотите делать, когда материал поступает из сети, и мы будем называть его, когда материал поступает из сети», поэтому вы избавлены от необходимости писать весь код до иметь дело с управлением сетевыми соединениями и т. д.

Если вы когда-либо писали сетевой код вручную, вы знаете, что в конечном итоге вы повторяете один и тот же материал снова, но это также нетривиальный код (как размерами, так и сложность), если вы пытаетесь сделать его профессиональным, надежным, высокопроизводительным и масштабируемым ... (Это скрытая сложность check_for_stuff_from_the_outside_world(), на которую все продолжают ссылаться.) Поэтому Node.js берет на себя ответственность за выполнение всего этого для вас (включая использование HTTP-протокола, если вы используете HTTP), и вам нужно только написать свою логику сервера.

Так что это не то, что асинхронный лучше сам по себе. Это просто естественная модель, которая соответствует функциональности, которую они предоставляют.

Вы увидите, что асинхронная модель также появляется во многих других местах: программирование на основе событий (которое используется во многих материалах GUI), RPC-серверы (например, Thrift), серверы REST, только для назовите несколько ... и, конечно, асинхронный ввод-вывод. ;)

Смежные вопросы