एक ही बार में कई async फ़ंक्शंस निष्पादित करने और परिणाम प्राप्त करने के लिए कैसे?

Aug 18 2020

मैंने Tokio कार्यों की कोशिश की है, लेकिन एक ही बार में कई कार्यों को निष्पादित करने के लिए कोई काम करने के उदाहरण नहीं हैं। इस कोड के साथ क्या समस्या है?

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");
}

यहाँ संकलक आउटपुट है

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

जवाब

6 Shepmaster Aug 18 2020 at 20:06

दो वायदा के लिए, जैसे आपके पास है, उपयोग करें future::join

use futures::{executor, future}; // 0.3.5

async fn speak() {
    let (_s, _g) = future::join(say(), greet()).await;
}

वहाँ तीन, चार, और पांच इनपुट भविष्य के लिए वेरिएंट हैं: join3, join4, join5।

भी नहीं है try_join(और try_join3, try_join4, try_join5जब अपने भविष्य की ओर से एक के लिए) Result

joinस्थैतिक में शामिल होने के लिए स्थैतिक संख्या को संभालने के लिए मैक्रो एक और तरीका है।

यदि आपको वायदा की एक गतिशील संख्या का समर्थन करने की आवश्यकता है, तो आप future::join_all(या try_join_all) का उपयोग कर सकते हैं , लेकिन आपके पास सभी प्रकार के वेक्टर होने चाहिए। यह FutureExt::boxed(या 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;
}

ध्यान दें कि यह कोड फ्यूचर्स को समवर्ती रूप से चला सकता है लेकिन उन्हें समानांतर में नहीं चलाएगा। समानांतर निष्पादन के लिए, आपको कुछ प्रकार के कार्यों को शुरू करने की आवश्यकता है।

यह सभी देखें:

  • मैं एक वेक्टर में सभी वायदा में कैसे शामिल हो सकता हूं बिना join_all की तरह विफलता पर रद्द किए बिना?
  • सीमित संगामिति के साथ वायदा शामिल करें
  • मैं रेकवेस्ट के साथ समानांतर एसिंक्रोनस HTTP जीईटी अनुरोध कैसे कर सकता हूं?
  • मैं वस्तुओं का विषम संग्रह कैसे बनाऊँ?
  • Rust में async / प्रतीक्षा का उद्देश्य क्या है?
  • समवर्ती और समानता के बीच अंतर क्या है?