Здравствуйте, vdimas, Вы писали:
V>Например, в моём ТЗ относительно "одновременных" записей сообщений в файл, этот файл НЕ НАДО лочить никаким асинхронным мьютексом, надо просто создать выделенный асинхронный процесс записи в файл, т.е. назначить файлу одного "владельца" и создать очередь из объектов-сообщений для записи в файл (или же из их сериализованных в байты тел — на вкус и цвет, как грится), где выделенный процесс будет эту очередь разгребать.
Такая очередь, если выделить её в отдельный компонент/функцию, и будет тем самым мутексом или семафором.
var operation = queued('resourceId', operationImpl, 2);
// последний аргумент - количество одновременных тасков, 1 = мутекс, >1 = семафор
//в разных задачах можно спокойно вызывать operation
>Вот так решаются подобные задачи в асинхронщине — через зависимости. Потому что, если очередь пуста, то операция записи в такую очередь породит зависимостьАвтор: vdimas
Дата: 13.06.15
(см function onKeyboard(nextChar) в сниппете по ссылке), — считай "разбудит" тот самый выделенный процесс, который пишет в файл. В этом и суть — что не шедуллер каждый раз проверяет "асинхронный мьютекс", (а на деле — вхолостую запускает задачу, а она, после обнаружения холостого запуска ставит сама себя в конец очереди и так бесконечно по кругу)
Асинхронному мутексу не надо ничего проверять. Он извлекает колбек из очереди и вызывает его. Если вызывающий код был готов писать в файл, то это значит, что все конкурирующие задачи или отработали или еще не начинали, а стало быть ресурс свободен.