Re[24]: Почему Эрланг
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.15 11:04
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Например, в моём ТЗ относительно "одновременных" записей сообщений в файл, этот файл НЕ НАДО лочить никаким асинхронным мьютексом, надо просто создать выделенный асинхронный процесс записи в файл, т.е. назначить файлу одного "владельца" и создать очередь из объектов-сообщений для записи в файл (или же из их сериализованных в байты тел — на вкус и цвет, как грится), где выделенный процесс будет эту очередь разгребать.


Такая очередь, если выделить её в отдельный компонент/функцию, и будет тем самым мутексом или семафором.

var operation = queued('resourceId', operationImpl, 2); 
// последний аргумент - количество одновременных тасков, 1 = мутекс, >1 = семафор

//в разных задачах можно спокойно вызывать operation


>Вот так решаются подобные задачи в асинхронщине — через зависимости. Потому что, если очередь пуста, то операция записи в такую очередь породит зависимость
Автор: vdimas
Дата: 13.06.15
(см function onKeyboard(nextChar) в сниппете по ссылке), — считай "разбудит" тот самый выделенный процесс, который пишет в файл. В этом и суть — что не шедуллер каждый раз проверяет "асинхронный мьютекс", (а на деле — вхолостую запускает задачу, а она, после обнаружения холостого запуска ставит сама себя в конец очереди и так бесконечно по кругу)


Асинхронному мутексу не надо ничего проверять. Он извлекает колбек из очереди и вызывает его. Если вызывающий код был готов писать в файл, то это значит, что все конкурирующие задачи или отработали или еще не начинали, а стало быть ресурс свободен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.