В современных менеджерах сценариев пользователей 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
Как достичь атомичности (и безопасность параллелизма в целом) при написании пользовательских сценариев? ⇐ Javascript
Форум по Javascript
1755274955
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. Классическая гоночная опасность. Какие методы параллелистики доступны для пользовательских сценариев?>
Подробнее здесь: [url]https://stackoverflow.com/questions/79736631/how-to-achieve-atomicity-and-concurrency-safety-more-generally-when-writing-us[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия