| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- use std::future::Future;
- use std::time::{Duration, Instant};
- use exchanges::response_base::ResponseData;
- use std::sync::Arc;
- use tokio::sync::Mutex;
- use tracing::info;
- use global::log_utils::init_log_with_info;
- struct Core {
- pub max_delay: u128
- }
- #[tokio::test]
- async fn framework_3_0() {
- init_log_with_info();
- let core = Arc::new(Mutex::new(Core { max_delay: 0 }));
- let handler_am = Arc::new(Mutex::new(TestHandler { core_am: core }));
- // 一个闭包解决了引用问题。
- generator(|data| {
- let handler_c = handler_am.clone();
- async move {
- let mut handler = handler_c.lock().await;
- handler.on_data(data).await
- }
- }).await;
- }
- // 消息创造者
- async fn generator<F, Fut>(handle_function: F)
- where
- F: Fn(ResponseData) -> Fut,
- Fut: Future<Output = ()> + Send + 'static, // 确保 Fut 是一个 Future,且输出类型为 ()
- {
- let data = ResponseData::new("aaa".to_string(),
- "code".to_string(),
- "msg".to_string(),
- "data".to_string());
- // let mut c = 0;
- loop {
- let mut s_data = data.clone();
- s_data.time = chrono::Utc::now().timestamp_micros();
- s_data.res_time = Instant::now();
- handle_function(s_data).await;
- tokio::time::sleep(Duration::from_micros(10)).await;
- }
- }
- struct TestHandler {
- pub core_am: Arc<Mutex<Core>>
- }
- impl TestHandler {
- // 消息处理者
- pub async fn on_data(&mut self, data: ResponseData) {
- let mut core = self.core_am.lock().await;
- let delay_nanos = data.res_time.elapsed().as_nanos();
- if delay_nanos > core.max_delay {
- core.max_delay = delay_nanos;
- }
- // 处理响应数据
- info!("delay nanos: {}, max delay is: {}", delay_nanos, core.max_delay);
- }
- }
|