Сообщение Re[13]: Для тех, кто смеется над JavaScript от 18.06.2020 7:17
Изменено 18.06.2020 7:19 Pauel
Re[13]: Для тех, кто смеется над JavaScript
Здравствуйте, Sharov, Вы писали:
I>>То есть, мы здесь запустили 6 параллельных цепочек, каждая из которых работает с одним и тем же разделяемым ресурсом.
S>Разве это параллельное исполнение? Это а-ля корутины для эмуляции многопоточности,
Это именно параллельное исполнение. В каком порядке выполняться будут опреации — никому неизвестно.
async/await это не эмуляция многопоточности, это связывание кусочков одной цепочки вместе. Унутре принципиально те же колбеки.
S>т.е. в один момент времени с файлом будет работать только один update(path, patternX), но мы правда не знаем какой...
async/await это принципиально тот же коллбек. Что бы гарантировать, что с ресурсом будет работать ровно один update, нужен механизм для линеаризации, та самая queue из моего примера.
Если логическая цепочка одна — то её части выполняются последовательно, для этого и нужен async/await, это связывание. Ровно так же, как и с колбеком-продолжением.
А вот если цепочек несколько, то никаких гарантий тебе никто не даст.
Вот решение задачи — просто инкрементим содержимое файла. Попробуй поиграться, запуская от 1 до n.
Колбеки
http://rsdn.org/forum/flame.comp/6423076.1
async/await:
I>>То есть, мы здесь запустили 6 параллельных цепочек, каждая из которых работает с одним и тем же разделяемым ресурсом.
S>Разве это параллельное исполнение? Это а-ля корутины для эмуляции многопоточности,
Это именно параллельное исполнение. В каком порядке выполняться будут опреации — никому неизвестно.
async/await это не эмуляция многопоточности, это связывание кусочков одной цепочки вместе. Унутре принципиально те же колбеки.
S>т.е. в один момент времени с файлом будет работать только один update(path, patternX), но мы правда не знаем какой...
async/await это принципиально тот же коллбек. Что бы гарантировать, что с ресурсом будет работать ровно один update, нужен механизм для линеаризации, та самая queue из моего примера.
Если логическая цепочка одна — то её части выполняются последовательно, для этого и нужен async/await, это связывание. Ровно так же, как и с колбеком-продолжением.
А вот если цепочек несколько, то никаких гарантий тебе никто не даст.
Вот решение задачи — просто инкрементим содержимое файла. Попробуй поиграться, запуская от 1 до n.
Колбеки
http://rsdn.org/forum/flame.comp/6423076.1
Автор: Ikemefula
Дата: 20.04.16
Дата: 20.04.16
async/await:
const {readFileSync} = require('fs');
const fs = require('fs').promises;
const fileName = 'i';
async function read_i() {
const x = await fs.readFile(fileName, {encoding:'utf8'});
return toNumber(x);
}
function write_i(i) {
return fs.writeFile(fileName, i);
}
function toNumber(buffer) {
return +(buffer || 0).toString();
}
async function task(n, id) {
while(n--) {
tap('before read_i', id);
const i = await read_i();
tap('after read_i', id);
await write_i(i + 1);
tap('after write_i', id);
}
}
function tap(msg, id) {
console.log(msg, readFileSync(fileName, {encoding:'utf8'}), id);
}
fs.writeFile(fileName,'');
task(10, 1);
task(10, 2);
task(10, 3);
task(10, 4);
task(10, 5);
task(10, 6);
Re[13]: Для тех, кто смеется над JavaScript
Здравствуйте, Sharov, Вы писали:
I>>То есть, мы здесь запустили 6 параллельных цепочек, каждая из которых работает с одним и тем же разделяемым ресурсом.
S>Разве это параллельное исполнение? Это а-ля корутины для эмуляции многопоточности,
Это именно параллельное исполнение. В каком порядке выполняться будут операции и их части — никому неизвестно.
async/await это не эмуляция многопоточности, это связывание кусочков одной цепочки вместе. Унутре принципиально те же колбеки.
S>т.е. в один момент времени с файлом будет работать только один update(path, patternX), но мы правда не знаем какой...
async/await это принципиально тот же коллбек. Что бы гарантировать, что с ресурсом будет работать ровно один update, нужен механизм для линеаризации, та самая queue из моего примера.
Если логическая цепочка одна — то её части выполняются последовательно, для этого и нужен async/await, это связывание. Ровно так же, как и с колбеком-продолжением.
А вот если цепочек несколько, то никаких гарантий тебе никто не даст.
Вот решение задачи — просто инкрементим содержимое файла. Попробуй поиграться, запуская от 1 до n задач.
Колбеки
http://rsdn.org/forum/flame.comp/6423076.1
async/await:
I>>То есть, мы здесь запустили 6 параллельных цепочек, каждая из которых работает с одним и тем же разделяемым ресурсом.
S>Разве это параллельное исполнение? Это а-ля корутины для эмуляции многопоточности,
Это именно параллельное исполнение. В каком порядке выполняться будут операции и их части — никому неизвестно.
async/await это не эмуляция многопоточности, это связывание кусочков одной цепочки вместе. Унутре принципиально те же колбеки.
S>т.е. в один момент времени с файлом будет работать только один update(path, patternX), но мы правда не знаем какой...
async/await это принципиально тот же коллбек. Что бы гарантировать, что с ресурсом будет работать ровно один update, нужен механизм для линеаризации, та самая queue из моего примера.
Если логическая цепочка одна — то её части выполняются последовательно, для этого и нужен async/await, это связывание. Ровно так же, как и с колбеком-продолжением.
А вот если цепочек несколько, то никаких гарантий тебе никто не даст.
Вот решение задачи — просто инкрементим содержимое файла. Попробуй поиграться, запуская от 1 до n задач.
Колбеки
http://rsdn.org/forum/flame.comp/6423076.1
Автор: Ikemefula
Дата: 20.04.16
Дата: 20.04.16
async/await:
const {readFileSync} = require('fs');
const fs = require('fs').promises;
const fileName = 'i';
async function read_i() {
const x = await fs.readFile(fileName, {encoding:'utf8'});
return toNumber(x);
}
function write_i(i) {
return fs.writeFile(fileName, i);
}
function toNumber(buffer) {
return +(buffer || 0).toString();
}
async function task(n, id) {
while(n--) {
tap('before read_i', id);
const i = await read_i();
tap('after read_i', id);
await write_i(i + 1);
tap('after write_i', id);
}
}
function tap(msg, id) {
console.log(msg, readFileSync(fileName, {encoding:'utf8'}), id);
}
fs.writeFile(fileName,'');
task(10, 1);
task(10, 2);
task(10, 3);
task(10, 4);
task(10, 5);
task(10, 6);