Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2019 July 30

KR

Kostyantin Randomnam... in NodeUA - JavaScript and Node.js in Ukraine
И по факту они ни на что не влияют
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
ну еще стоит учесть, что в POSIX запись данных идет через буфер
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
@MityaSaray aaa, гуд, спасибо
источник

🏡К

🏡 Назар Калитюк... in NodeUA - JavaScript and Node.js in Ukraine
простий приклад на пальцях, Ти стоїш на горі і в тебе є 10 великих гумових куль. Ти всі по черзі з мінімальним інтервалом штовхаєш з гори, по черзі з 0 до 9. Але не можна сказати в якому порядку вони докотяться до кінця.
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
Alexander
ну еще стоит учесть, что в POSIX запись данных идет через буфер
на что это должно наталкивать?
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Sergey Vats
на что это должно наталкивать?
это говорит о том, что явных локов файла на запись может не быть. А имеет место быть некий буфер, в который будет складываться инфа об изменениях и потом как буфер заполнится, он будет записан на диск.
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
@nazarkk спасибо с этим вроде разобрался
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
так что тут много ньюансов, в которых на ночь глядя разобраться - так себе идея
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
надо смотреть в код libuv и самого ивентлупа, вникать в доку https://github.com/nodejs/node/blob/d6f6d7f8541327b72667d38777c47b9ea675125d/deps/uv/docs/src/loop.rst
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
@nazarkk @m03geek @MityaSaray спасибо за внимание
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Может Тимур подключится, он точно больше моего внутренности ноды ковырял.
источник
2019 July 31

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
@svatz по вчерашнему вопросу. Сутра думается лучше, поэтому почти все встало на свои места.

Итак цикл for перебирает значения i от 0 до 9 и вызывает ф-цию fs.writeFile. Эта функция будет вызываться всегда с разным значением i (т.е. от 0 до 9), т.к. при вызове ф-ции джаваскрипт сразу же определяет значения аргументов передаваемых туда (т.е. не будет такого, что i передается в ф-цию записи файла когда цикл for уже віполнился).

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

fs.writeFile(file, 0, () => {
 console.log('write file 0')
})
fs.writeFile(file, 1, () => {
 console.log('write file 1')
})
...
fs.writeFile(file, 9, () => {
 console.log('write file 0')
})


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

В итоге какие-то записи улетают вникуда. Отсюда и получаются рандомные числа.

Если в конец кода добавить
setTimeout(() => {}, 1000);
чтобы точно дать всем операциям ввода-вывода завершиться. Или чутка переписать

(async () => {
 await Promise.all([
   fs.promises.writeFile(file, 0),
   fs.promises.writeFile(file, 1),
   fs.promises.writeFile(file, 2),
   fs.promises.writeFile(file, 3),
   fs.promises.writeFile(file, 4),
   fs.promises.writeFile(file, 5),
   fs.promises.writeFile(file, 6),
   fs.promises.writeFile(file, 7),
   fs.promises.writeFile(file, 8),
   fs.promises.writeFile(file, 9),
 ])
})()

и дождаться выполнения всех операций, то все встает на свои места и в файле будет всегда цифра 9. Ну как всегда :), у меня почти всегда, но бывает проскакивает 8. С 8 уже сложнее объяснить. Это возможно как и какие-то особенности работы libuv, так и буферизация записи на диск.
источник

KR

Kostyantin Randomnam... in NodeUA - JavaScript and Node.js in Ukraine
Пока висит коллбек нода не остановится
источник

KR

Kostyantin Randomnam... in NodeUA - JavaScript and Node.js in Ukraine
Таймаут на секунду не нужон
источник

A

Alexander in NodeUA - JavaScript and Node.js in Ukraine
Попробуйте без таймаута и с :)
источник

KR

Kostyantin Randomnam... in NodeUA - JavaScript and Node.js in Ukraine
Сет таймаут делает только одно - добавляет коллбек чтобы нода не остановилась
источник

SV

Sergey Vats in NodeUA - JavaScript and Node.js in Ukraine
Alexander
@svatz по вчерашнему вопросу. Сутра думается лучше, поэтому почти все встало на свои места.

Итак цикл for перебирает значения i от 0 до 9 и вызывает ф-цию fs.writeFile. Эта функция будет вызываться всегда с разным значением i (т.е. от 0 до 9), т.к. при вызове ф-ции джаваскрипт сразу же определяет значения аргументов передаваемых туда (т.е. не будет такого, что i передается в ф-цию записи файла когда цикл for уже віполнился).

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

fs.writeFile(file, 0, () => {
 console.log('write file 0')
})
fs.writeFile(file, 1, () => {
 console.log('write file 1')
})
...
fs.writeFile(file, 9, () => {
 console.log('write file 0')
})


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

В итоге какие-то записи улетают вникуда. Отсюда и получаются рандомные числа.

Если в конец кода добавить
setTimeout(() => {}, 1000);
чтобы точно дать всем операциям ввода-вывода завершиться. Или чутка переписать

(async () => {
 await Promise.all([
   fs.promises.writeFile(file, 0),
   fs.promises.writeFile(file, 1),
   fs.promises.writeFile(file, 2),
   fs.promises.writeFile(file, 3),
   fs.promises.writeFile(file, 4),
   fs.promises.writeFile(file, 5),
   fs.promises.writeFile(file, 6),
   fs.promises.writeFile(file, 7),
   fs.promises.writeFile(file, 8),
   fs.promises.writeFile(file, 9),
 ])
})()

и дождаться выполнения всех операций, то все встает на свои места и в файле будет всегда цифра 9. Ну как всегда :), у меня почти всегда, но бывает проскакивает 8. С 8 уже сложнее объяснить. Это возможно как и какие-то особенности работы libuv, так и буферизация записи на диск.
Благодарю за пояснение
источник

BY

Bohdan Yurchuk in NodeUA - JavaScript and Node.js in Ukraine
@tshemsedinov, можете перезалить видео. У меня и у друзей не грузится
https://youtu.be/bHn-wTlTTR0
источник

🐊

🐊 in NodeUA - JavaScript and Node.js in Ukraine
Вантажиться нормально.
источник

BY

Bohdan Yurchuk in NodeUA - JavaScript and Node.js in Ukraine
🐊
Вантажиться нормально.
після 17хв
источник