refactor: methods
This commit is contained in:
@@ -8,14 +8,14 @@ use std::task::{Context, Poll};
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use bytes::BytesMut;
|
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::sync::mpsc::{channel, Receiver, Sender};
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
use tokio::time::sleep;
|
use tokio::time::sleep;
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn 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 (left_to_right_sender, left_to_right_receiver) = channel::<StreamPackage>(512);
|
||||||
let (right_to_left_sender, right_to_left_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![];
|
let mut joins = vec![];
|
||||||
for _ in 0..3 {
|
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 right_stream = create_stream(new_channel_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 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 (right_stream_reader, right_stream_writer) = tokio::io::split(right_stream);
|
||||||
let (left_stream_reader, mut left_stream_writer) = tokio::io::split(left_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 a = loop_read(right_stream_reader, format!("#{} right reader", new_channel_id));
|
||||||
let b = loop_read(left_stream_reader, format!("#{} left reader", new_stream_id));
|
let b = loop_read(left_stream_reader, format!("#{} left reader", new_channel_id));
|
||||||
let c = tokio::spawn(async move {
|
|
||||||
for i in 0..3 {
|
let c = loop_send(new_channel_id, right_stream_writer, format!("right sender"));
|
||||||
sleep(Duration::from_millis(100)).await;
|
let d = loop_send(new_channel_id, left_stream_writer, format!("left sender"));
|
||||||
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;
|
|
||||||
});
|
|
||||||
|
|
||||||
joins.extend([a, b, c, d]);
|
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 (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_map_left_locked.insert(channel_id, new_sender);
|
||||||
}
|
}
|
||||||
Stream {
|
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<()> {
|
fn loop_read(mut reader: ReadHalf<Stream>, tag: String) -> JoinHandle<()> {
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
let mut buf = BytesMut::with_capacity(4096);
|
let mut buf = BytesMut::with_capacity(4096);
|
||||||
|
|||||||
Reference in New Issue
Block a user