Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Когда следует сипользовать асинхронный ввод/вывод? (https://javascript.ru/forum/node-js-io-js/64482-kogda-sleduet-sipolzovat-asinkhronnyjj-vvod-vyvod.html)

Dicot 14.08.2016 23:46

Когда следует сипользовать асинхронный ввод/вывод?
 
Добрый вечер.

Подскажите, пожалуйста, стоит ли в таком простейшем веб-сервере
http.createServer( function ( request, response ){

  var requestUrl = decodeURI( request.url );
  var filePath = parseFilePath( requestUrl );
  var fileExt = parseFileExt( filePath );

  fs.readFile( filePath, function( err, data ){
    if( err ){
      response.writeHead( 500, {"Content-Type" : "text/plain" } );
      response.write( err.message );
      response.end();        
    }else{
      response.writeHead( 200, {"Content-Type" : contentTypesByExtension[ fileExt ]} );
      response.write( data );
      response.end();
    }
  }); 
} ).listen( 80 );

использовать асинхронный readFile? Будет ли здесь преимущество перед readFileSync?
Кое-где я встречал мнение, что синхронный ввод/вывод (в частности readFileSync) не следует использовать вообще никогда.
Спасибо.

evth 15.08.2016 02:21

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

nerv_ 15.08.2016 08:17

Цитата:

Сообщение от Dicot
Когда следует сипользовать асинхронный ввод/вывод?

Если ты написал этот код в учебных целях, вероятно, достаточно будет синхронной работы с файлами.
Если ты пытаешься создать сервер, работающей под большими нагрузками, используют преимущества асинхронности и потоков. В данном случае, твой код следует переписать с использованием потоков http://www.youtube.com/watch?v=1rbmO71wwyU http://learn.javascript.ru/screencast/nodejs

Dicot 15.08.2016 18:51

Здравствуйте.
Спасибо за ответы.

Я то думал, что обработка каждого запроса к серверу происходит независимо (в отдельном потоке, например) - отсюда и непонимание, что же может заблокировать синхронный ввод/вывод.
После того, как нашел информацию про цикл событий и единственный поток в котором он работвает стало немного понятнее. Буду признателен за ссылки на любую инфу по этой теме.

Dicot 15.08.2016 19:02

evth, но ведь большой файл все равно когда-нибудь надо будет прочитать. Или в асинхронном режиме процесс чтения разбивается на несколько частей, а в перерывах выполняются другие задачи? А когда файл будет наконец полностью считан в память вызывается колбэк?
Поправьте, пожалуйста, если я ошибаюсь.

Erolast 16.08.2016 06:43

Цитата:

но ведь большой файл все равно когда-нибудь надо будет прочитать
Да, но этим занимается сторонняя система - файловая, если упрощать - жесткий диск. Нода лишь принимает данные.

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

Dicot 16.08.2016 23:36

Спсибо, Erolast.
После Вашего ответа и просмотра скринкаста по node.js (Введение в асинхронную разработку, Событийный цикл, libuv) все стало ясно.


Часовой пояс GMT +3, время: 03:45.