Eugene-Usachev
@Eugene-Usachev

Какие существуют кольцевые lock free очереди / каналы для Rust?

У меня есть один главный поток и n вторичных. Главный поток отправляет данные конкретному потоку и ожидает от него ответ. Для этой задачи традиционно используют каналы. Я попробовал использовать std::sync::mpsc::channel и ужаснулся его скорости (в плохом смысле). Конкретно в этой задаче можно схитрить, а именно не использовать блокировщики (только atomic), так как у нас по сути spsc. Хотелось бы использовать для этой задачи кольцевые lock free очереди (одна пишет, вторая читает и так для каждого из n потоков). Я попробовал найти такие очереди, но нашёл или обычные медленные каналы или очереди, которые возвращают None, когда пустые (мне нужно, чтобы условный метод dequeue ждал, пока не будет хотя бы каких данных). Какие существуют кольцевые lock free очереди / каналы вы используете для Rust?
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 3
mayton2019
@mayton2019
Bigdata Engineer
Тебе не нужно никакое кольцо. Ищи просто lock-free очереди. Если будет кольцо
- то тебе не хватит памяти и нужно будет придумывать механизм выхода из
ситуации (хопа привет блокировка).
Ответ написан
Комментировать
vabka
@vabka
Токсичный шарпист
Если используешь async, то tokio::sync::mpsc - в токио нет выделенного spsc, так что для таких сценариев рекомендуют его.
Если допустимо терять какие-то данные, то можешь tokio::sync::watch попробовать.

Если не используешь async, то блокировка будет, если канал пуст.
Но в принципе можешь попробовать crossbeam.

Если нужно настоящее кольцо, то вроде есть крейты с соответствующим названием, но их я не пробовал
Ответ написан
Комментировать
@blandger
Могу порекомендовать статью, может подскажет что полезное.
www.rossbencina.com/code/lockfree
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы