Блокирует ли асинхронные методы чтения FileReader основной поток? - PullRequest
0 голосов
/ 10 июня 2019

Я знаю, что асинхронные методы должны быть неблокирующими.Но обычно я вижу, что они применяются к внешним операциям, таким как fetch(). Т.е.: вещи, которые обрабатываются вне браузера.

Но как насчет API FileReader()?Обработка файлов выполняется браузером, верно?

const reader = new FileReader();

reader.onload = (event) => {
  console.log(event.target.result);
};

reader.onerror = (event) => {
  console.log(event.target.result);
};


// **ONE** OF THE POSSIBLE METHODS BELOW

reader.readAsText(file);
reader.readAsArrayBuffer(file);
reader.readAsBinaryString(file);
reader.readAsDataURL(file);

ВОПРОС

Если я прочитаю файл размером 100 ГБ, это когда-нибудь заблокирует мой основной поток?Я имею в виду, даже если он ожидает, пока стек вызовов не будет пуст, прежде чем он запустится, заблокирует ли это мой основной поток всякий раз, когда он обрабатывает какой-то огромный файл?Как это работает в этом случае?

Каким бы ни был ответ, он применим к любому методу, который выполняет асинхронную операцию, которая в конце концов обрабатывается браузером?

1 Ответ

1 голос
/ 10 июня 2019

Да, это "асинхронно".

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

Фактическое чтение и обработка двоичных данных в любом формате, который вы просили, должно быть выполнено параллельно .

Параллельное выполнение шагов означает, что эти шаги должны выполняться один за другим одновременно с другой логикой в ​​стандарте (например, в то же время, что и цикл обработки событий). Этот стандарт не определяет точный механизм, с помощью которого это достигается, будь то совместная многозадачность с разделением времени, волокна, потоки, процессы, использование различных гиперпотоков, ядер, процессоров, компьютеров и т. Д. Напротив, операция, которая должна выполняться немедленно должен прервать текущую задачу, запустить ее сам, а затем возобновить ранее выполненную задачу.

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

Теперь, чтение файла объемом 100 ГБ, безусловно, вызовет ошибку, указывающую, что у вас недостаточно памяти. А если у вас достаточно памяти, то есть вероятность, что ваш компьютер все равно будет страдать от такого большого объема данных.
Таким же образом сгенерированные данные будут занимать память при отправке обратно в ваш поток через свойство .result . Работа со слишком большими данными, вероятно, повлияет на производительность вашей страницы.

...