Ver código fonte

加入cci缓存,防止中控因等待时间过长杀死rust。

skyffire 1 ano atrás
pai
commit
814c49bf12
1 arquivos alterados com 35 adições e 3 exclusões
  1. 35 3
      src/server.rs

+ 35 - 3
src/server.rs

@@ -1,5 +1,6 @@
 use std::sync::Arc;
 use std::sync::atomic::{AtomicBool, Ordering};
+use std::time::Duration;
 use actix_web::{web, App, HttpResponse, HttpServer, Responder, post, get};
 use tokio::sync::Mutex;
 use tracing::{info};
@@ -8,14 +9,14 @@ use global::cci::CentralControlInfo;
 #[derive(Clone)]
 struct Arcs {
     running: Arc<AtomicBool>,
-    cci_arc: Arc<Mutex<CentralControlInfo>>
+    cci_cache_arc: Arc<Mutex<CentralControlInfo>>
 }
 
 // 句柄 GET 请求
 #[get("/account")]
 async fn get_account(arcs: web::Data<Arcs>) -> impl Responder {
     // --------------------------------数据解锁处理--------------------------------
-    let cci = arcs.cci_arc.lock().await;
+    let cci = arcs.cci_cache_arc.lock().await;
 
     // --------------------------------回报--------------------------------
     let json_string = serde_json::to_string(&(cci.clone())).unwrap();
@@ -29,13 +30,44 @@ async fn on_change(arcs: web::Data<Arcs>) -> impl Responder {
     HttpResponse::Ok().body("程序已收到退出信号,将在清退仓位后退出。".to_string())
 }
 
+pub fn run_cci_cache(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Arc<Mutex<CentralControlInfo>> {
+    // cci缓存,防止中控因等待时间过长杀死rust
+    let cci_cache = CentralControlInfo {
+        now_balance: Default::default(),
+        unrealized_pn_l: Default::default(),
+        pos: Default::default(),
+        entry_price: Default::default(),
+        now_price: Default::default(),
+    };
+    let cci_cache_arc = Arc::new(Mutex::new(cci_cache));
+    let cci_cache_arc_clone = cci_cache_arc.clone();
+    tokio::spawn(async move {
+        loop {
+            tokio::time::sleep(Duration::from_secs(1)).await;
+
+            let cci = cci_arc.lock().await;
+            {
+                let cci_cache = cci_cache_arc_clone.lock().await;
+                cci_cache.now_price = cci.now_price;
+                cci_cache.pos = cci.pos;
+                cci_cache.unrealized_pn_l = cci.unrealized_pn_l;
+                cci_cache.now_balance = cci.now_balance;
+                cci_cache.entry_price = cci.entry_price;
+            }
+        }
+    });
+
+    return cci_cache_arc;
+}
+
 pub fn run_server(port: u32, running: Arc<AtomicBool>, cci_arc: Arc<Mutex<CentralControlInfo>>) {
     let addr = format!("0.0.0.0:{}", port);
     info!("中控绑定地址:{}", addr);
 
+    // 启动server
     let arcs = Arcs {
         running: running.clone(),
-        cci_arc: cci_arc.clone(),
+        cci_cache_arc: run_cci_cache(cci_arc),
     };
 
     let server_fut = HttpServer::new(move || {