rocksdb и там только блокирующие апи.
Написал такие обертки для каждого вызова к rocksdb и общаюсь через канал
fn spawn_task_put(
base: Arc<rocksdb::DBWithThreadMode<rocksdb::MultiThreaded>>,
) -> mpsc::Sender<(Vec<u8>, Vec<u8>, oneshot::Sender<anyhow::Result<()>>)> {
let (tx, mut rx) = mpsc::channel::<(Vec<u8>, Vec<u8>, oneshot::Sender<anyhow::Result<()>>)>(
CHANNEL_BUFFER_LEN,
);
task::spawn_blocking(move || {
while let Some((key, val, out)) = rx.blocking_recv() {
let res = base.put(key, val);
// ignore is closed
let _ = out.send(res.map_err(|e| anyhow::Error::new(e)));
}
});
tx
}
Емнип примерно как поток создавать
Я вот подумал что вообще хрень натворил. Наверное профитнее всего отказатся от мультипоточной версии базы тоесть исключить потери на вызовы в кернел для блокировок (если на чтение тоже блокируется). Выделить процесс под базу и общаться с ней через канал.
Обсуждают сегодня