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
                  
                  
                      }
                  
                  
                
Емнип примерно как поток создавать
 Дмитрий
                          Бондаренко
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                      
                      
                        
                          Дмитрий
                          Бондаренко
                        
                      
                    
                    
                    
                    
                      Автор вопроса
                    
                    
                  Я вот подумал что вообще хрень натворил. Наверное профитнее всего отказатся от мультипоточной версии базы тоесть исключить потери на вызовы в кернел для блокировок (если на чтение тоже блокируется). Выделить процесс под базу и общаться с ней через канал.
Обсуждают сегодня