|
@@ -1,3 +1,4 @@
|
|
|
|
|
+use std::collections::HashMap;
|
|
|
use std::sync::Arc;
|
|
use std::sync::Arc;
|
|
|
use std::sync::atomic::AtomicBool;
|
|
use std::sync::atomic::AtomicBool;
|
|
|
use std::time::Duration;
|
|
use std::time::Duration;
|
|
@@ -5,6 +6,7 @@ use tokio::spawn;
|
|
|
use tokio::sync::Mutex;
|
|
use tokio::sync::Mutex;
|
|
|
use anyhow::Result;
|
|
use anyhow::Result;
|
|
|
use chrono::Utc;
|
|
use chrono::Utc;
|
|
|
|
|
+use serde_json::Value;
|
|
|
use tokio_tungstenite::tungstenite::Message;
|
|
use tokio_tungstenite::tungstenite::Message;
|
|
|
use tracing::{error, info};
|
|
use tracing::{error, info};
|
|
|
use crate::data_manager::DataManager;
|
|
use crate::data_manager::DataManager;
|
|
@@ -13,20 +15,18 @@ use crate::exchange::response_base::Response;
|
|
|
|
|
|
|
|
pub struct WsManager {
|
|
pub struct WsManager {
|
|
|
pub symbols: Vec<String>,
|
|
pub symbols: Vec<String>,
|
|
|
- pub data_manager_am: Arc<Mutex<DataManager>>,
|
|
|
|
|
|
|
+ pub managers: Arc<Mutex<Vec<Arc<Mutex<DataManager>>>>>,
|
|
|
|
|
+ pub filtered_map: HashMap<String, Value>,
|
|
|
pub running: Arc<AtomicBool>,
|
|
pub running: Arc<AtomicBool>,
|
|
|
- pub delay_total: Arc<Mutex<u64>>,
|
|
|
|
|
- pub delay_count: Arc<Mutex<u64>>,
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
impl WsManager {
|
|
impl WsManager {
|
|
|
- pub fn new(symbols: Vec<String>, data_manager_am: Arc<Mutex<DataManager>>, running: Arc<AtomicBool>) -> WsManager {
|
|
|
|
|
|
|
+ pub fn new(symbols: Vec<String>, filtered_map: HashMap<String, Value>, running: Arc<AtomicBool>) -> WsManager {
|
|
|
let mut wm = WsManager {
|
|
let mut wm = WsManager {
|
|
|
symbols,
|
|
symbols,
|
|
|
- data_manager_am,
|
|
|
|
|
|
|
+ filtered_map,
|
|
|
running,
|
|
running,
|
|
|
- delay_total: Arc::new(Mutex::new(0)),
|
|
|
|
|
- delay_count: Arc::new(Mutex::new(0)),
|
|
|
|
|
|
|
+ managers: Arc::new(Mutex::new(vec![])),
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
wm.show_delay_infos().expect("初始化延迟监听失败");
|
|
wm.show_delay_infos().expect("初始化延迟监听失败");
|
|
@@ -42,11 +42,17 @@ impl WsManager {
|
|
|
let num_batches = (self.symbols.len() + BATCH_SIZE - 1) / BATCH_SIZE;
|
|
let num_batches = (self.symbols.len() + BATCH_SIZE - 1) / BATCH_SIZE;
|
|
|
|
|
|
|
|
for i in 0..num_batches {
|
|
for i in 0..num_batches {
|
|
|
- let dm = self.data_manager_am.clone();
|
|
|
|
|
- let dt = self.delay_total.clone();
|
|
|
|
|
- let dc = self.delay_count.clone();
|
|
|
|
|
|
|
+ let data_manager = DataManager::new(self.filtered_map.clone());
|
|
|
|
|
+ let data_manager_am = Arc::new(Mutex::new(data_manager));
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ self.managers.lock().await.push(data_manager_am.clone());
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 定义需要处理数据的fun
|
|
// 定义需要处理数据的fun
|
|
|
|
|
+ let dm = data_manager_am.clone();
|
|
|
|
|
+ let dt = data_manager_am.lock().await.delay_total.clone();
|
|
|
|
|
+ let dc = data_manager_am.lock().await.delay_count.clone();
|
|
|
let fun = move |response: Response| {
|
|
let fun = move |response: Response| {
|
|
|
if response.code != 200 {
|
|
if response.code != 200 {
|
|
|
error!("出现错误代码:{}", serde_json::to_string_pretty(&response.data).unwrap());
|
|
error!("出现错误代码:{}", serde_json::to_string_pretty(&response.data).unwrap());
|
|
@@ -117,8 +123,7 @@ impl WsManager {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
pub fn show_delay_infos(&mut self) -> Result<()> {
|
|
pub fn show_delay_infos(&mut self) -> Result<()> {
|
|
|
- let dt = self.delay_total.clone();
|
|
|
|
|
- let dc = self.delay_count.clone();
|
|
|
|
|
|
|
+ let dms = Arc::clone(&self.managers);
|
|
|
|
|
|
|
|
spawn(async move {
|
|
spawn(async move {
|
|
|
// 使用 tokio::time::interval 创建一个周期性定时器
|
|
// 使用 tokio::time::interval 创建一个周期性定时器
|
|
@@ -127,12 +132,16 @@ impl WsManager {
|
|
|
loop {
|
|
loop {
|
|
|
interval.tick().await; // 等待下一个周期
|
|
interval.tick().await; // 等待下一个周期
|
|
|
|
|
|
|
|
- // 获取 dt 和 dc 的当前值
|
|
|
|
|
- let dt_guard = dt.lock().await;
|
|
|
|
|
- let dc_guard = dc.lock().await;
|
|
|
|
|
|
|
+ let mut total_delay = 0u64;
|
|
|
|
|
+ let mut delay_count = 0u64;
|
|
|
|
|
|
|
|
- let total_delay = *dt_guard;
|
|
|
|
|
- let delay_count = *dc_guard;
|
|
|
|
|
|
|
+ let managers = dms.lock().await;
|
|
|
|
|
+ for manager in managers.iter() {
|
|
|
|
|
+ let td_guard = manager.lock().await.delay_total.lock().await.clone();
|
|
|
|
|
+ let dc_guard = manager.lock().await.delay_count.lock().await.clone();
|
|
|
|
|
+ total_delay += td_guard;
|
|
|
|
|
+ delay_count += dc_guard;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 计算平均延迟
|
|
// 计算平均延迟
|
|
|
if delay_count > 0 {
|
|
if delay_count > 0 {
|