2015-06-01 8 views
7

में चल रहे थ्रेड निम्न कोड पर विचार करें, मैं x थ्रेड को स्पिन करना चाहता हूं, जो कोड के भीतर निर्दिष्ट सर्वर पर x अनुरोधों को आग लगाएगा, हालांकि वर्तमान में, मेरा एप्लिकेशन प्रत्येक थ्रेड और x अनुरोधों को समाप्त करने का इंतजार कर रहा है अगले एक को कताई से पहले।समांतर

मैं इस async करने के बारे में कैसे जा सकता हूं?

extern crate hyper; 
extern crate time; 

use hyper::Client; 
use hyper::header::Connection; 
use time::*; 
use std::thread; 
use std::sync::{Arc, Mutex}; 

struct Request { 
    elapsed_time: f64 
} 

impl Request{ 
    fn new(elapsed_time: f64) -> Request{ 
     Request { 
      elapsed_time: elapsed_time, 
     } 
    } 
} 

fn main() { 
    let requests = Arc::new(Mutex::new(Vec::new())); 

    for _x in 0..100 { 
     println!("Spinning up thread..."); 

     let mut client = Client::new(); 
     let thread_items = requests.clone(); 

     let handle = thread::spawn(move || { 
      for _x in 0..100 { 
       println!("Firing the request"); 
       let start = time::precise_time_s(); 

       let _res = client.get("http://jacob.uk.com") 
        .header(Connection::close()) 
        .send().unwrap(); 

       let end = time::precise_time_s(); 

       thread_items.lock().unwrap().push((Request::new(end-start))); 
      } 
     }); 

     handle.join().unwrap(); 
    } 
} 

कार्यक्रम उत्पादन:

handle.join().unwrap(); 

आप सही में धागा आप join यह शुरू करने के बाद पाश में एक धागा पर अमल, और उसके बाद:

Spinning up thread... 
Firing request 
Firing request 
Firing request 
Firing request 
Spinning up thread... 
Firing request 
Firing request 
Firing request 
Firing request 
Spinning up thread... 
Firing request 
Firing request 
Firing request 
Firing request 

उत्तर

8

आपका अपराधी इस लाइन है मुख्य धागा

आप क्या कर सकते हैं, Vec बनाने और वीसी में सभी हैंडल डालना है। फिर, एक और पाश में, आप join सभी हैंडल।

एक और संभावना है कि थ्रेड में शामिल न हों, और उन्हें स्वाभाविक रूप से बाहर निकलने दें, लेकिन तब आप नहीं जान पाएंगे कि उन सभी को कब किया जाता है। जो, @ डेलन नोट्स के रूप में, मुख्य धागे को स्प्रेड किए गए धागे से बाहर निकलने से पहले बाहर निकलने की अनुमति दे सकता है। इससे सभी स्पॉन्डेड थ्रेडों को समाप्त करने की बजाए मारने के बजाए मार दिया जाता है।

+3

धागे में शामिल नहीं होने के साथ एक समस्या यह है कि (गैर-डिमन्स के लिए) मुख्य धागे मरने पर प्रक्रिया मर जाती है, इसलिए ओपी के कोड में कार्यकर्ता धागे को छोटा कर दिया जाएगा। – delnan