Информация об изменениях

Сообщение 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
Автор: Ikemefula
Дата: 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
Автор: Ikemefula
Дата: 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);