В чем разница между асинхронным вводом / выводом и асинхронной функцией? - PullRequest
11 голосов
/ 29 сентября 2011

Node.js, это асинхронный ввод / вывод.что это на самом деле означает?

Есть ли разница между тем, как я создаю асинхронную функцию, порождая другой поток для выполнения процесса?

например,

void asyncfuntion(){
    Thread apple = new Thread(){
       public void run(){
           ...do stuff
       }
    }
    apple.start()
}

Если есть разницая могу сделать асинхронный ввод-вывод в JavaScript?

Ответы [ 6 ]

13 голосов
/ 29 сентября 2011

Асинхронный ввод / вывод

Асинхронный ввод / вывод (из Википедии)

Асинхронный ввод / вывод, или неблокирующий ввод / вывод, является формой ввода / вывода обработка, позволяющая продолжить другую обработку до передача закончена.

Это означает, что если процесс хочет выполнить read() или write() в синхронном вызове, процесс должен будет ждать, пока аппаратное обеспечение завершит физический ввод-вывод, чтобы его можно было информировать о успех / неудача операции ввода / вывода.

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

Асинхронная функция

Асинхронные функции - это функция, которая возвращает данные обратно вызывающей стороне с помощью обработчика событий (или функций обратного вызова ). Функция обратного вызова может быть вызвана в любое время (в зависимости от того, сколько времени требуется для выполнения асинхронной функции). Это не похоже на синхронную функцию, которая выполнит свои инструкции перед возвратом значения.

... я могу сделать асинхронный ввод / вывод в Java?

Да, Java NIO обеспечивает неблокирующую поддержку ввода / вывода через Selector . Кроме того, Apache MINA - это сетевая инфраструктура, которая также включает неблокирующий ввод / вывод. Соответствующий SO вопрос отвечает на этот вопрос.

4 голосов
/ 29 сентября 2011
3 голосов
/ 29 сентября 2011

В дополнение к ответу @The Elite Gentleman, узел не порождает потоки для асинхронных функций ввода / вывода.Все под узлом выполняется в однопоточном цикле событий .Вот почему очень важно избегать синхронизированных версий некоторых функций ввода-вывода, если это не является абсолютно необходимым, например, fs.readSync

. Вы можете прочитать этот отличный пост в блоге для некоторого понимания: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

1 голос
/ 06 марта 2013

Я исследовал тот же вопрос, так как этот шаблон асинхронного ввода-вывода был очень новым для меня. Я нашел этот разговор на infoq.com, что сделало меня очень счастливым. Парень очень хорошо объясняет, где на самом деле находится асинхронный ввод-вывод (ОС -> ядро) и как он встроен в node.js в качестве основной идиомы для выполнения ввода-вывода. Наслаждайтесь!

http://www.infoq.com/presentations/Nodejs-Asynchronous-IO-for-Fun-and-Profit

0 голосов
/ 20 февраля 2018

С https://en.wikipedia.org/wiki/Asynchronous_I/O

Синхронная блокировка ввода / вывода

Простой подход к вводу / выводу состоит в том, чтобы запустить доступ, а затем дождаться его завершения.

Блокирует выполнение программы во время обмена данными, оставляя системные ресурсы бездействующими.

Асинхронный ввод / вывод

В качестве альтернативы,возможно начать связь и затем выполнить обработку, которая не требует завершения ввода-вывода.

Любая задача, которая зависит от завершения ввода-вывода ... все еще должна ждать ввода-выводаОперация / O завершена и, таким образом, все еще заблокирована,

, но может продолжаться другая обработка, которая не зависит от операции ввода-вывода.

Пример:

https://en.wikipedia.org/wiki/Node.js

Node.js имеет управляемую событиями архитектуру , способную к асинхронному вводу / выводу

0 голосов
/ 29 сентября 2011

node.js позволяет программисту выполнять асинхронный ввод-вывод путем принудительного использования обратных вызовов. Теперь обратные вызовы похожи на старые асинхронные функции, которые мы использовали долгое время для обработки событий DOM в javascript! например

asyncIOReadFile(fileName, asynFuncReadTheActualContentsAndDoSomethingWithThem);
console.log('IDontKnowWhatIsThereInTheFileYet')
function asynFuncReadTheActualContentsAndDoSomethingWithThem(fileContents) {
    console.log('Now I know The File Contents' + fileContents)
}
//Generally the output of the above program will be following
'IDontKnowWhatIsThereInTheFileYet'
//after quite a bit of time
'Now I know The File Contents somebinarystuff'
...