Bagaimana cara menjalankan beberapa fungsi asinkron sekaligus dan mendapatkan hasilnya?
Saya telah mencoba tugas Tokio, tetapi tidak ada contoh yang berfungsi untuk menjalankan banyak tugas sekaligus. Apa yang salah dengan kode ini?
fn main() {
block_on(speak());
}
async fn speak() {
let hold = vec![say(), greet()];
let results = join_all(hold).await;
}
async fn say() {
println!("hello");
}
async fn greet() {
println!("world");
}
berikut adalah keluaran kompilernya
error[E0308]: mismatched types
--> sync\src\main.rs:14:27
|
14 | let hold = vec![say(),greet()];
| ^^^^^^^ expected opaque type, found a different opaque type
...
23 | async fn greet(){
| - the `Output` of this `async fn`'s found opaque type
|
= note: expected type `impl core::future::future::Future` (opaque type at <sync\src\main.rs:19:15>)
found opaque type `impl core::future::future::Future` (opaque type at <sync\src\main.rs:23:17>)
= note: distinct uses of `impl Trait` result in different opaque types
Jawaban
Untuk dua masa depan, seperti yang Anda miliki, gunakan future::join
use futures::{executor, future}; // 0.3.5
async fn speak() {
let (_s, _g) = future::join(say(), greet()).await;
}
Ada varian untuk tiga, empat, dan lima berjangka masukan: join3, join4, join5.
Ada juga try_join(dan try_join3, try_join4, try_join5) ketika masa depan Anda mengembalikan Result
.
Makro joinadalah cara lain untuk menangani sejumlah statis futures untuk digabungkan.
Jika Anda perlu mendukung sejumlah dinamis masa depan, Anda dapat menggunakan future::join_all(atau try_join_all), tetapi Anda harus memiliki semua jenis vektor. Ini paling mudah melalui FutureExt::boxed(atau FutureExt::boxed_local):
use futures::{executor, future, FutureExt}; // 0.3.5
async fn speak() {
let futures = vec![say().boxed(), greet().boxed()];
let _results = future::join_all(futures).await;
}
Perhatikan bahwa kode ini dapat menjalankan kontrak berjangka secara bersamaan tetapi tidak akan menjalankannya secara paralel. Untuk eksekusi paralel, Anda perlu memperkenalkan beberapa jenis tugas.
Lihat juga:
- Bagaimana saya bisa menggabungkan semua masa depan dalam vektor tanpa membatalkan kegagalan seperti yang dilakukan join_all?
- Bergabunglah dengan kontrak berjangka dengan konkurensi terbatas
- Bagaimana saya bisa melakukan permintaan HTTP GET asynchronous paralel dengan reqwest?
- Bagaimana cara membuat koleksi objek yang heterogen?
- Apa tujuan async / await di Rust?
- Apa perbedaan antara Concurrency dan Paralelisme?