refactor: methods

This commit is contained in:
2022-03-19 23:36:45 +08:00
parent effb8587b1
commit 7007a77334

View File

@@ -8,14 +8,14 @@ use std::task::{Context, Poll};
use std::time::Duration;
use bytes::BytesMut;
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf, ReadHalf};
use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, ReadBuf, ReadHalf, WriteHalf};
use tokio::sync::mpsc::{channel, Receiver, Sender};
use tokio::task::JoinHandle;
use tokio::time::sleep;
#[tokio::main]
async fn main() {
let stream_id = AtomicU64::new(1);
let channel_id = AtomicU64::new(1);
let (left_to_right_sender, left_to_right_receiver) = channel::<StreamPackage>(512);
let (right_to_left_sender, right_to_left_receiver) = channel::<StreamPackage>(512);
@@ -28,30 +28,19 @@ async fn main() {
let mut joins = vec![];
for _ in 0..3 {
let new_stream_id = stream_id.fetch_add(1, Ordering::SeqCst);
let new_channel_id = channel_id.fetch_add(1, Ordering::SeqCst);
let right_stream = create_stream(new_stream_id, right_to_left_sender.clone(), right_consumer_stream_map.clone());
let left_stream = create_stream(new_stream_id, left_to_right_sender.clone(), left_consumer_stream_map.clone());
let right_stream = create_stream(new_channel_id, right_to_left_sender.clone(), right_consumer_stream_map.clone());
let left_stream = create_stream(new_channel_id, left_to_right_sender.clone(), left_consumer_stream_map.clone());
let (right_stream_reader, mut right_stream_writer) = tokio::io::split(right_stream);
let (left_stream_reader, mut left_stream_writer) = tokio::io::split(left_stream);
let (right_stream_reader, right_stream_writer) = tokio::io::split(right_stream);
let (left_stream_reader, left_stream_writer) = tokio::io::split(left_stream);
let a = loop_read(right_stream_reader, format!("#{} right reader", new_stream_id));
let b = loop_read(left_stream_reader, format!("#{} left reader", new_stream_id));
let c = tokio::spawn(async move {
for i in 0..3 {
sleep(Duration::from_millis(100)).await;
let _ = right_stream_writer.write_all(format!("Right send message: {} - {}", new_stream_id, i).as_bytes()).await;
}
let _ = right_stream_writer.shutdown().await;
});
let d = tokio::spawn(async move {
for i in 0..3 {
sleep(Duration::from_millis(100)).await;
let _ = left_stream_writer.write_all(format!("Left send message: {} - {}", new_stream_id, i).as_bytes()).await;
}
let _ = left_stream_writer.shutdown().await;
});
let a = loop_read(right_stream_reader, format!("#{} right reader", new_channel_id));
let b = loop_read(left_stream_reader, format!("#{} left reader", new_channel_id));
let c = loop_send(new_channel_id, right_stream_writer, format!("right sender"));
let d = loop_send(new_channel_id, left_stream_writer, format!("left sender"));
joins.extend([a, b, c, d]);
}
@@ -60,10 +49,10 @@ async fn main() {
}
}
fn create_stream(channel_id: u64, sender: Sender<StreamPackage>, left_stream_map: Arc<Mutex<HashMap<u64, Sender<StreamPackage>>>>) -> Stream {
fn create_stream(channel_id: u64, sender: Sender<StreamPackage>, consumer_stream_map: Arc<Mutex<HashMap<u64, Sender<StreamPackage>>>>) -> Stream {
let (new_sender, receiver) = channel::<StreamPackage>(16);
{
let stream_map_left_locked = &mut left_stream_map.lock().unwrap();
let stream_map_left_locked = &mut consumer_stream_map.lock().unwrap();
stream_map_left_locked.insert(channel_id, new_sender);
}
Stream {
@@ -73,6 +62,16 @@ fn create_stream(channel_id: u64, sender: Sender<StreamPackage>, left_stream_map
}
}
fn loop_send(channel_id: u64, mut writer: WriteHalf<Stream>, tag: String) -> JoinHandle<()> {
tokio::spawn(async move {
for i in 0..3 {
sleep(Duration::from_millis(100)).await;
let _ = writer.write_all(format!("Send message: [{}] {} - {}", &tag, channel_id, i).as_bytes()).await;
}
let _ = writer.shutdown().await;
})
}
fn loop_read(mut reader: ReadHalf<Stream>, tag: String) -> JoinHandle<()> {
tokio::spawn(async move {
let mut buf = BytesMut::with_capacity(4096);