172 похожих чатов

Ребят, подскажите. Есть мьютекс, который используется, как в асинхронной среде,

так и синхронной среде. Проблема в том, что если я использую мьютекс из std, то у меня потенциально лочится экзекьютор в асинке. Если из tokio::sync, то мне приходится плодить отдельный рантайм для block_on() над асинхронным мьютексом. Есть ли вообще реализации sync <=> async мьютекса ?

26 ответов

34 просмотра

Асинхронный мьютекс почти никогда не нужен

Max Силинг
Асинхронный мьютекс почти никогда не нужен

А если у тебя синхронный мьютекс держится между вызовами .await, которые потенциально долгие?

Max Силинг
Задуматься о дизайне.

Ответ уровня - Доктор у меня болит когда я делаю так - Не делайте так больше

Артем Пятницкий
Ответ уровня - Доктор у меня болит когда я делаю т...

Ну, да, примерно. Если у тебя в коде появились асинхронные мьютексы, то, скорее всего, тебе дальше будет больно. В этот момент имеет смысл остановиться и подумать, нельзя ли это выразить по-другому.

Max Силинг
Ну, да, примерно. Если у тебя в коде появились аси...

А есть вообще причина не использовать асинхронные мьютексы вообще везде? Ну то есть я реально хочу узнать почему бы их не использовать вместо синхронных (Пы. сы. я юзаю синхронные примитивы в асинхронном коде по рекомендации токио, но просто хочу узнать причину не юзать асинхронные)

Артем Пятницкий
А есть вообще причина не использовать асинхронные ...

Ровно та причина, по которой они вообще существуют — их можно держать между await-поинтами. Синхронизация резко становится сложнее, если пока ты держишь мьютекс, может произойти что угодно ещё в том же треде. Ну и они несколько менее производительные, но это не так важно само по себе.

Lighty- Автор вопроса
Артем Пятницкий
А есть вообще причина не использовать асинхронные ...

Ай гесс, дис ризон - "The feature that the async mutex offers over the blocking mutex is the ability to keep it locked across an .await point. This makes the async mutex more expensive than the blocking mutex, so the blocking mutex should be preferred in the cases where it can be used."

Артем Пятницкий
А если у тебя синхронный мьютекс держится между вы...

Всегда, ещё задолго до async/await, когда человечество знало только потоки — всегда всех предупреждали против долгого лока мьютекса. Потому что пока мьютекс залочен, работает только один поток, и многопоточная программа превращается в однопоточную. Только медленнее, потому что ещё накладные расходы на мьютекс. Это никогда не имело смысла, и прозрачно намекало на неудачный дизайн.

Lighty
Ай гесс, дис ризон - "The feature that the async m...

Ну то есть если мне нужно держать лок в течении нескольких .await’ов, то лучше юзать асинхронный?

Артем Пятницкий
Ну то есть если мне нужно держать лок в течении не...

Да, но ещё лучше — сделать так, чтобы его не надо было держать в течение нескольких await-ов.

Max Силинг
Да, но ещё лучше — сделать так, чтобы его не надо ...

Не знаю как можно пройтись по коллекции и вызвать у каждого элемента асинхронную функцию так, чтобы лок на колекцию не держать

Alexander Chichigin
Всегда, ещё задолго до async/await, когда человече...

*Один поток, из всех, которые работают с этими же данными Или я чего-то про мьютексы не знаю и они все потоки останавливают?

Max Силинг
Зачем держать лок на коллекцию?

Ну мне нужно пройтись по Arc<Mutex<Vec<_>>> допустим. В нее могут добавлять элементы и убирать. Как обойтись без мьютексов и лока на них если нужна операция, выполняющаяся на всех иногда?

Артем Пятницкий
*Один поток, из всех, которые работают с этими же ...

Да, из всех, которые работают с этими данными. Но если Вам нужно, чтобы с этими данными работал только один поток — зачем запускать несколько и лочить их мьютексом?

Alexander Chichigin
Да, из всех, которые работают с этими данными. Но ...

Не особо понял. У меня есть состояние приложение AppState через которое все компоненты общаются. Каждый компонент в своей таске запущен и может модифицировать AppState. Как без примитивов синхронизации тут обойтись?

Артем Пятницкий
Не особо понял. У меня есть состояние приложение A...

Зависит от конкретной нагрузки Можно, например, запустить главный стейт в отдельной таске и посылать ему сообщения по каналам

Max Силинг
Точно ли это обязано быть Vec?

В моем случае это hashmap в основном, но. я просто пример коллекции привел

Max Силинг
Зависит от конкретной нагрузки Можно, например, за...

жирнющие match event мне тоже не очень нравятся (а в моем случае их реально много)

попробуй использовать канал вместо мьютекса некоторые виды каналов позволяют взаимодействовать между двух сред даже канал из std синхронный может подойти (unbounded), зависит что и откуда ты посылаешь и где принимаешь по-сути токийский мутекс это тоже очередь у тебя взаимодействие между потоками, поэтому не надо им иметь общую блокировку, пусть общаются сообщениями по -поводу синк-мутекса: если он нужен чтобы защитить данные, т.е. взять мутекс, записать в переменную и тут же отпустить, то подойдет и синхронный, потому что запись в память быстро происходит

Yaro
попробуй использовать канал вместо мьютекса некото...

Там основная задержка - не запись в память, а лок мутекса. Несколько (десятков) миллионов локов в секунду могут загрузить процессор на 100%. Так что с ними надо осторожно

Lighty- Автор вопроса
Yaro
попробуй использовать канал вместо мьютекса некото...

На самом деле, решил проблему чисто архитектурно. У меня лок происходит в цикле (внутри асинка). Как только я получаю данные из структуры, я под них спавню таску. Поэтому, анлок получается практически инстантным. А так- спасибо, не подумал о каналах, буду иметь в виду.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта