私のプロジェクトの3つの異なるモジュールで使用される単純なサーバーを実装したいと思います。
これらのモジュールはサーバーにデータを送信し、サーバーにファイルを保存し、これらのモジュールがジョブを完了するとこれらの情報をマージします。 これらの情報はすべて、タイムスタンプ(浮動小数点数)とラベル(浮動小数点数または文字列)を持ちます。Rustマルチスレッドサーバーで使用できる構造を作成するにはどうすればよいですか?
これは、これらの情報を保存するために私のデータ構造である:
pub struct Data {
file_name: String,
logs: Vec<(f32, String)>,
measures: Vec<(f32, f32)>,
statements: Vec<(f32, String)>,
}
は、私は、サーバーと対話するsocket
を使用しています。
も使用してData
構造体を実装し、これらのモジュールごとに共有可能にします。
したがって、私はクライアントを処理するとき、モジュールによって送信されたメッセージが正しいかどうかを確認し、それが良いデータ構造フィールド(logs
、measures
またはstatements
)にメッセージを処理して保存する新しい関数を呼び出すかどうかを確認します。 。
// Current ip address
let ip_addr: &str = &format!("{}:{}",
&ip,
port);
// Bind the current IP address
let listener = match TcpListener::bind(ip_addr) {
Ok(listener) => listener,
Err(error) => panic!("Canno't bind {}, due to error {}",
ip_addr,
error),
};
let global_data_struct = Data::new(DEFAULT_FILE.to_string());
let global_data_struct_shared = Arc::new(global_data_struct);
// Get and process streams
for stream in listener.incoming() {
let mut global_data_struct_shared_clone = global_data_struct_shared.clone();
thread::spawn(move || {
// Borrow stream
let stream = stream;
match stream {
// Get the stream value
Ok(mut stream_v) => {
let current_ip = stream_v.peer_addr().unwrap().ip();
let current_port = stream_v.peer_addr().unwrap().port();
println!("Connected with peer {}:{}", current_ip, current_port);
// PROBLEM IN handle_client!
// A get_mut from global_data_struct_shared_clone
// returns to me None, not a value - so I
// can't access to global_data_struct_shared_clone
// fields :'(
handle_client(&mut stream_v, &mut global_data_struct_shared_clone);
},
Err(_) => error!("Canno't decode stream"),
}
});
}
// Stop listening
drop(listener);
私にArc::get_mut(global_data_struct_shared_clone)
戻りNone
ので、私は、global_data_struct_shared_clone
のフィールドを処理するhandle_client
で変更可能な参照を取得するためにいくつかの問題を持っている - により、各着信要求に対してglobal_data_struct_shared.clone()
へ。
これらの3つのモジュール間でこの構造を正しく管理するのに助けてくれる人がいますか?
'Arc>'を使ってみましたか? –
いいえ、特に私のモジュールの誰もモジュールによって既に存在するフィールドにアクセスすることはないので、私は 'Mutex'を使って問題が発生すると思います。各モジュールは 'Data'に独自のフィールドを持っています - したがって、' Arc 'に 'Mutex'を与えると無駄に私の構造体をブロックするでしょう...? – WebTogz
これは処理中にブロックするだけですが、より細分化して完全に行うことができます:) –