Как достичь атомичности (и безопасность параллелизма в целом) при написании пользовательских сценариев?Javascript

Форум по Javascript
Ответить
Anonymous
 Как достичь атомичности (и безопасность параллелизма в целом) при написании пользовательских сценариев?

Сообщение Anonymous »

В современных менеджерах сценариев пользователей API, доступные для доступа к хранилищам частного для пользовательского скрипта, такие как gm.getValue и gm.setValue , являются асинхронными. Поскольку они асинхронны, сценарии, использующие их, подвержены планированию одновременно друг с другом; Такие параллельные выполнения могут мешать друг другу и заставить сценарий работать неправильно, разбивая предположения о атомичности, которые сценарий был бы свободен, были синхронными операциями (как в более старых версиях). < /p>
Для простого примера, предполагаю, что у меня есть этот пользовательский сценарий: < /p>
{
(async () => {
await GM.deleteValue(KEY);
alert("[COUNTER] was reset");
})().catch(err => {
console.error(`[COUNTER]`, err);
});
});

GM.registerMenuCommand("[COUNTER] START", () => {
(async () => {
const x0 = await GM.getValue(KEY) ?? 0;
const iters = 50;
for (let i = 0; i < iters; ++i) {
const x = await GM.getValue(KEY) ?? 0;
console.info(`[COUNTER] iteration ${i}: ${x}`);
await GM.setValue(KEY, 1 + x);
}
const x1 = await GM.getValue(KEY);
alert(`[COUNTER] ran from ${x0} to ${x1} in ${iters} iterations`);
})().catch(err => {
console.error(`[COUNTER]`, err);
});
});

GM.registerMenuCommand("[COUNTER] GET", () => {
(async () => {
alert(`[COUNTER] is ${await GM.getValue(KEY)}`);
})().catch(err => {
console.error(`[COUNTER]`, err);
});
});
< /code>
Я могу установить этот скрипт в Greasemonkey и запустить действие «[счетчик] старт» на двух разных вкладках. Если бы приращения были атомными, как можно было бы наивно ожидать, я бы получил значение 100 в конце; Окончательное значение i на самом деле get IS 64. Классическая гоночная опасность. Какие методы параллелистики доступны для пользовательских сценариев?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... writing-us
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»