назад и мне отчаянно нужна помощь.
Подскажите, пожалуйста, как мне решить проблему:
я открываю .write() на инстансе структуры (не шарю за терминологию) и пишу в его свойства. Но в других местах моей программы я должен читать из этого инстанса, (но тут есть момент - я должен держать write ОТКРЫТЫМ) но делать этого я не могу из-за :RwLock
что я должен делать в расте, чтобы читать и писать одновременно?
Ничо не понял. Зачем держать открытым. В любом случае подозреваю что тебе в раст бегиннерз. (Соседний чат)
Прошу прощения, однако в чем тогда цель этого чата?
Эээ... Все ещё не понял вопрос. Тут никто не пытается тебя послать. Не подумай так.
Мб тебе подойдёт single producer-multi consumer channel?
Выглядит как "я хочу отстрелить себе ногу, подскажите". Но вряд ли ты хотел спросить именно это. Возможно, тебе нужны lock-free структуры данных?
Я так не думаю, я просто пошёл и спросил в этом соседнем чате :)
его и юзаю я юзаю tokio и обертываю с помощью RwLock структуры, которые под капотом листенят вебсокеты и накапливают в себя данные. А другой таске мне надо читать и обрабатывать эти накопленные данные раз в секунду. Чтобы стартануть сами вебсокеты и начать запись, мне нужен write на RwLock В другом месте я читаю данные из этих структур, но т.к выхода из скоупа не произошло, данные структуры залочены и я не могу сделать их read. Основной вопрос: может использовать какой-то другой паттерн, чтобы обойти проблему или есть иные способы при текущей реализации? На расте недавно, я пытаюсь портировать node.js код
Ты имплементируешь паттерн или юзаешь готовую реализацию?
готовую реализацию, наверное. стандартную mpsc::channel. ну либо я не понял вопроса
Тогда почему у тебя есть общий лок на чтение/запись?
потому что помимо отправки обработки данных в других тасках/потоках (для этого нужен лок), мне еще нужно обрабатывать события для других целей (отправлять конкретные кусочки данных, изменивших стейт залоченный)
Для отправки лок не нужен, потому что в этом смысл канала. Трансмиттер для multi producer channel имплементирует Clone, поэтому его нужно клонировать, а не шерить. Лок у него есть внутри То же самое с принимающей стороной, если канал multi-consumer
Раздели структуру на две
У меня примерно такой же код к слову)
Обсуждают сегодня