複数のURLを複数指定することを試みていますstd::thread
。これは私のコードは、これまでどのように見えるかです:Rustのスレッド間で文字列を共有
fn fetch(urls: Vec<&str>) {
let (tx, rx) = mpsc::channel();
for url in urls {
let tx = tx.clone();
thread::spawn(|| {
let ssl = NativeTlsClient::new().unwrap();
let connector = HttpsConnector::new(ssl);
let client = Client::with_connector(connector);
let mut res = client.get(url).send().unwrap();
let mut result = String::new();
res.read_to_string(&mut result);
tx.send(result).unwrap();
});
}
//let mut result: Vec<String> = vec![];
for _ in urls {
println!("{}", rx.recv().unwrap());
}
}
しかし、私は言ったエラーました:
thread::spawn(move || {
...
I:
error[E0277]: the trait bound `std::sync::mpsc::Sender<std::string::String>: std::marker::Sync` is not satisfied
--> src/lib.rs:18:9
|
18 | thread::spawn(|| {
| ^^^^^^^^^^^^^ the trait `std::marker::Sync` is not implemented for `std::sync::mpsc::Sender<std::string::String>`
|
= note: `std::sync::mpsc::Sender<std::string::String>` cannot be shared between threads safely
= note: required because of the requirements on the impl of `std::marker::Send` for `&std::sync::mpsc::Sender<std::string::String>`
= note: required because it appears within the type `[[email protected]/lib.rs:18:23: 29:10 url:&&str, tx:&std::sync::mpsc::Sender<std::string::String>]`
= note: required by `std::thread::spawn`
私はthread::spawn
でmove
を入れてみましたときに生涯に関する別のエラーが発生しました:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/lib.rs:15:16
|
15 | for url in urls {
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the block at 12:26...
--> src/lib.rs:12:27
|
12 | fn fetch(urls: Vec<&str>) {
| ^
note: ...so that expression is assignable (expected std::vec::Vec<&str>, found std::vec::Vec<&str>)
--> src/lib.rs:15:16
|
15 | for url in urls {
| ^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that the type `[[email protected]/lib.rs:18:23: 27:10 url:&str, tx:std::sync::mpsc::Sender<std::string::String>]` will meet its required lifetime bounds
--> src/lib.rs:18:9
|
18 | thread::spawn(move || {
| ^^^^^^^^^^^^^
ここからチャンネルを介してスレッドから文字列を送信する適切な方法は何ですか?そして、後のエラーで生涯の問題を解決するにはどうすればいいですか?
ありがとうございました!
非常に詳細な回答ありがとうございました!2番目のソリューション '& 'static str'は本当に私のために働いた! –