Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.08.2016, 23:46
Новичок на форуме
Отправить личное сообщение для Dicot Посмотреть профиль Найти все сообщения от Dicot
 
Регистрация: 14.08.2016
Сообщений: 4

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

Подскажите, пожалуйста, стоит ли в таком простейшем веб-сервере
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) не следует использовать вообще никогда.
Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 15.08.2016, 02:21
Новичок на форуме
Отправить личное сообщение для evth Посмотреть профиль Найти все сообщения от evth
 
Регистрация: 15.08.2016
Сообщений: 1

асинхронное чтение файла нужно использовать всегда (кроме работы с консольными приложениями: сборщики, компиляторы и т.п.).
это связано с тем, что при синхронном чтении, сервер при каждом запросе будет ждать выполнения чтения файла, и только тогда переходить к следующему обработчику запроса.
например, если нужно вернуть файл размером в пару ГБ, то пока этот файл не будет прочтен, ни один пользователь не увидит ответа на свой запрос.
при асинхронном чтении файла такой проблемы не возникает
Ответить с цитированием
  #3 (permalink)  
Старый 15.08.2016, 08:17
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Dicot
Когда следует сипользовать асинхронный ввод/вывод?
Если ты написал этот код в учебных целях, вероятно, достаточно будет синхронной работы с файлами.
Если ты пытаешься создать сервер, работающей под большими нагрузками, используют преимущества асинхронности и потоков. В данном случае, твой код следует переписать с использованием потоков http://www.youtube.com/watch?v=1rbmO71wwyU http://learn.javascript.ru/screencast/nodejs
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 15.08.2016, 18:51
Новичок на форуме
Отправить личное сообщение для Dicot Посмотреть профиль Найти все сообщения от Dicot
 
Регистрация: 14.08.2016
Сообщений: 4

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

Я то думал, что обработка каждого запроса к серверу происходит независимо (в отдельном потоке, например) - отсюда и непонимание, что же может заблокировать синхронный ввод/вывод.
После того, как нашел информацию про цикл событий и единственный поток в котором он работвает стало немного понятнее. Буду признателен за ссылки на любую инфу по этой теме.
Ответить с цитированием
  #5 (permalink)  
Старый 15.08.2016, 19:02
Новичок на форуме
Отправить личное сообщение для Dicot Посмотреть профиль Найти все сообщения от Dicot
 
Регистрация: 14.08.2016
Сообщений: 4

evth, но ведь большой файл все равно когда-нибудь надо будет прочитать. Или в асинхронном режиме процесс чтения разбивается на несколько частей, а в перерывах выполняются другие задачи? А когда файл будет наконец полностью считан в память вызывается колбэк?
Поправьте, пожалуйста, если я ошибаюсь.
Ответить с цитированием
  #6 (permalink)  
Старый 16.08.2016, 06:43
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

То есть, смысл асинхронности именно в работе со сторонними системами. Это может быть отдельный поток на текущей машине, может быть вообще другая машина, неважно; главное, что эта система работает независимо и неизвестно, когда она закончит и закончит ли вообще. Асинхронность позволяет во время ожидания ответа от таковой заниматься чем-то еще, а не тормозить весь процесс.
Ответить с цитированием
  #7 (permalink)  
Старый 16.08.2016, 23:36
Новичок на форуме
Отправить личное сообщение для Dicot Посмотреть профиль Найти все сообщения от Dicot
 
Регистрация: 14.08.2016
Сообщений: 4

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск