fast_able/fast_thread_pool/mod.rs
1#[cfg(test)]
2pub mod test;
3
4pub mod pool;
5pub use pool::*;
6
7pub mod lite;
8pub use lite::*;
9
10pub mod const_num;
11pub use const_num::*;
12
13#[path = "./task_executor_crossbeam.rs"]
14pub mod task_executor;
15pub use task_executor::*;
16
17#[test]
18fn test_thread() {
19 // fast_able::fast_thread_pool::_test_get_core_ids();
20
21 std::env::set_var("RUST_LOG", "debug");
22 env_logger::init();
23
24 // 线程开启平均耗时: 1761 ns
25 test::_main_loop(30, 100);
26
27 // 线程开启平均耗时: 956.6 ns
28 // fast_able::fast_thread_pool::thread_mod::_test_ThreadPoolConstNum(1000);
29
30 // thread_lite 测试结果: 线程开启平均耗时: 168.1962 micros
31 // 因为是串行同步开启线程, 所以耗时会比较长
32 // fast_able::fast_thread_pool::thread_mod::_test_thread_lite(1000);
33
34 std::thread::sleep(std::time::Duration::from_secs(3));
35}
36
37/*
38[2024-07-01T08:11:32Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456000, 所有任务耗时(微秒): 1245146, 平均耗时: 2, 耗时任务数(100微秒): 255, 耗时任务数占比: 6/10000
39[2024-07-01T08:11:35Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456300, 所有任务耗时(微秒): 1181427, 平均耗时: 2, 耗时任务数(100微秒): 223, 耗时任务数占比: 5/10000
40[2024-07-01T08:11:38Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456700, 所有任务耗时(微秒): 1176375, 平均耗时: 2, 耗时任务数(100微秒): 183, 耗时任务数占比: 4/10000
41[2024-07-01T08:11:41Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 457200, 所有任务耗时(微秒): 1218507, 平均耗时: 2, 耗时任务数(100微秒): 236, 耗时任务数占比: 5/10000
42[2024-07-01T08:11:44Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 457100, 所有任务耗时(微秒): 1159028, 平均耗时: 2, 耗时任务数(100微秒): 113, 耗时任务数占比: 2/10000
43[2024-07-01T08:11:47Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456808, 所有任务耗时(微秒): 1170696, 平均耗时: 2, 耗时任务数(100微秒): 218, 耗时任务数占比: 5/10000
44[2024-07-01T08:11:50Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456992, 所有任务耗时(微秒): 1254381, 平均耗时: 2, 耗时任务数(100微秒): 242, 耗时任务数占比: 5/10000
45[2024-07-01T08:11:53Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 458001, 所有任务耗时(微秒): 1181228, 平均耗时: 2, 耗时任务数(100微秒): 165, 耗时任务数占比: 4/10000
46[2024-07-01T08:11:56Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 454999, 所有任务耗时(微秒): 1220606, 平均耗时: 2, 耗时任务数(100微秒): 230, 耗时任务数占比: 5/10000
47[2024-07-01T08:11:59Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 457400, 所有任务耗时(微秒): 1203115, 平均耗时: 2, 耗时任务数(100微秒): 155, 耗时任务数占比: 3/10000
48[2024-07-01T08:12:02Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456400, 所有任务耗时(微秒): 1316857, 平均耗时: 2, 耗时任务数(100微秒): 474, 耗时任务数占比: 10/10000
49[2024-07-01T08:12:05Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456100, 所有任务耗时(微秒): 1189001, 平均耗时: 2, 耗时任务数(100微秒): 113, 耗时任务数占比: 2/10000
50[2024-07-01T08:12:08Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 457000, 所有任务耗时(微秒): 1273741, 平均耗时: 2, 耗时任务数(100微秒): 309, 耗时任务数占比: 7/10000
51[2024-07-01T08:12:11Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456700, 所有任务耗时(微秒): 1175973, 平均耗时: 2, 耗时任务数(100微秒): 326, 耗时任务数占比: 7/10000
52[2024-07-01T08:12:14Z INFO fast_able::fast_thread_pool] 3秒钟执行任务数: 456400, 所有任务耗时(微秒): 1178047, 平均耗时: 2, 耗时任务数(100微秒): 221, 耗时任务数占比: 5/10000
53*/
54#[test]
55fn _test_task_executor() {
56 std::env::set_var("RUST_LOG", "debug");
57 env_logger::init();
58
59 init();
60 let pool = TaskExecutor::new(core_affinity::CoreId { id: 21 }, -1);
61 std::thread::sleep(std::time::Duration::from_millis(200));
62
63 let count = std::sync::Arc::new(crossbeam::atomic::AtomicCell::new(0_i64));
64 let elapsed_total = std::sync::Arc::new(crossbeam::atomic::AtomicCell::new(0_i64));
65 let elapsed_exp = std::sync::Arc::new(crossbeam::atomic::AtomicCell::new(0_i64));
66
67 let count_c = count.clone();
68 let elapsed_total_c = elapsed_total.clone();
69 let elapsed_exp_c = elapsed_exp.clone();
70 std::thread::spawn(move || loop {
71 std::thread::sleep(std::time::Duration::from_secs(3));
72 let count = count_c.fetch_and(0);
73 let elapsed_total = elapsed_total_c.fetch_and(0);
74 let elapsed_exp = elapsed_exp_c.fetch_and(0);
75 info!(
76 "3秒钟执行任务数: {}, 所有任务耗时(微秒): {}, 平均耗时: {}, 耗时任务数(100微秒): {}, 耗时任务数占比: {:.0}/10000",
77 count,
78 elapsed_total,
79 elapsed_total / count,
80 elapsed_exp,
81 elapsed_exp as f64 / count as f64 * 10000.0,
82 );
83 });
84
85 loop {
86 for i in 0..100 {
87 let time_hs = std::time::Instant::now();
88 let count = count.clone();
89 let elapsed_total = elapsed_total.clone();
90 let elapsed_exp = elapsed_exp.clone();
91 // spin::Barrier::new(i % 10).wait();
92 // spin::relax::Loop::(Duration::from_micros(i % 50));
93 pool.spawn(move |_| {
94 let micros = time_hs.elapsed().as_micros();
95 count.fetch_add(1);
96 elapsed_total.fetch_add(micros as i64);
97 if micros > 100 {
98 elapsed_exp.fetch_add(1);
99 }
100 });
101 }
102 std::thread::sleep(std::time::Duration::from_micros(110));
103 }
104 std::thread::sleep(std::time::Duration::from_secs(9999));
105}
106
107#[test]
108fn _test_tokio() {
109 std::env::set_var("RUST_LOG", "debug");
110 env_logger::init();
111
112 init();
113 let pool = tokio::runtime::Builder::new_multi_thread()
114 .worker_threads(4)
115 .enable_all()
116 .build()
117 .unwrap();
118 std::thread::sleep(std::time::Duration::from_millis(200));
119
120 static statis_v: once_cell::sync::Lazy<crate::statis::Statis> =
121 once_cell::sync::Lazy::new(|| crate::statis::Statis::new(|v| debug!("一秒并发: {v}")));
122
123 static thread_lite: once_cell::sync::Lazy<crate::fast_thread_pool::ThreadPoolLite> =
124 once_cell::sync::Lazy::new(|| crate::fast_thread_pool::ThreadPoolLite::new());
125 thread_lite.spawn(move || {
126 warn!("thread_lite init");
127 });
128 std::thread::sleep(std::time::Duration::from_millis(600));
129
130 loop {
131 for _ in 0..500 {
132 let time_hs = std::time::Instant::now();
133 pool.spawn_blocking(move || {
134 // println!("run _test_thread_lite i: {}", i);
135 let micros = time_hs.elapsed().as_micros();
136 if micros > 1000 {
137 thread_lite.spawn(move || {
138 warn!("任务耗时过长: {} micros", micros);
139 });
140 }
141 statis_v.add();
142 });
143 }
144 // std::thread::sleep(std::time::Duration::from_micros(550));
145 }
146 std::thread::sleep(std::time::Duration::from_secs(9999));
147}