Когда следует сипользовать асинхронный ввод/вывод?
Добрый вечер.
Подскажите, пожалуйста, стоит ли в таком простейшем веб-сервере 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) не следует использовать вообще никогда. Спасибо. |
асинхронное чтение файла нужно использовать всегда (кроме работы с консольными приложениями: сборщики, компиляторы и т.п.).
это связано с тем, что при синхронном чтении, сервер при каждом запросе будет ждать выполнения чтения файла, и только тогда переходить к следующему обработчику запроса. например, если нужно вернуть файл размером в пару ГБ, то пока этот файл не будет прочтен, ни один пользователь не увидит ответа на свой запрос. при асинхронном чтении файла такой проблемы не возникает |
Цитата:
Если ты пытаешься создать сервер, работающей под большими нагрузками, используют преимущества асинхронности и потоков. В данном случае, твой код следует переписать с использованием потоков http://www.youtube.com/watch?v=1rbmO71wwyU http://learn.javascript.ru/screencast/nodejs |
Здравствуйте.
Спасибо за ответы. Я то думал, что обработка каждого запроса к серверу происходит независимо (в отдельном потоке, например) - отсюда и непонимание, что же может заблокировать синхронный ввод/вывод. После того, как нашел информацию про цикл событий и единственный поток в котором он работвает стало немного понятнее. Буду признателен за ссылки на любую инфу по этой теме. |
evth, но ведь большой файл все равно когда-нибудь надо будет прочитать. Или в асинхронном режиме процесс чтения разбивается на несколько частей, а в перерывах выполняются другие задачи? А когда файл будет наконец полностью считан в память вызывается колбэк?
Поправьте, пожалуйста, если я ошибаюсь. |
Цитата:
То есть, смысл асинхронности именно в работе со сторонними системами. Это может быть отдельный поток на текущей машине, может быть вообще другая машина, неважно; главное, что эта система работает независимо и неизвестно, когда она закончит и закончит ли вообще. Асинхронность позволяет во время ожидания ответа от таковой заниматься чем-то еще, а не тормозить весь процесс. |
Спсибо, Erolast.
После Вашего ответа и просмотра скринкаста по node.js (Введение в асинхронную разработку, Событийный цикл, libuv) все стало ясно. |
Часовой пояс GMT +3, время: 12:22. |