2015-09-08 15 views
5

मैं जंग websocket library उपयोग कर रहा हूँ बातें करने के लिए बात करने के लिए और मैं इस सूत्र है कि इस तरह मोटे तौर पर दिखता है:पढ़ना दो अवरुद्ध iterators

thread::spawn(move || { 
    for message in receiver.incoming_messages() { 
     /* Do same stuff */ 
    } 
}); 
:

thread::spawn(move || { 
    while let Ok(Message::Text(text)) = receiver.recv_message() { 
     /* Do some stuff */ 
    } 
}); 

ऊपर रिसीवर भी एक अवरुद्ध इटरेटर हो सकता है

मैं इस धागे को एक सिग्नल भेजना चाहता हूं जो इसे चीजों को रोकने से रोकने के लिए कहता है। मैंने सोचा कि mpsc::channel इस सिग्नल भेजने के लिए बहुत अच्छा होगा। select! जाने का तरीका प्रतीत होता था, लेकिन यह केवल तभी काम करता है जब सभी चैनल mpsc::channel प्रकार हैं।

क्या ऐसा कुछ है जो दो अवरोधक इटरेटर्स में शामिल हो सकता है और आउटपुट प्रदान करता है क्योंकि डेटा आता है? या इस मुद्दे के लिए कोई अन्य समाधान? मैं इनपुट के प्रत्येक स्रोत के लिए धागा बनाने और अपनी खुद की कतार का प्रबंधन करने से बचना चाहता हूं।

+0

व्यस्त प्रतीक्षा ... (यानी, वे यात्रा के अंत में कुछ भी है, और उपज/नींद अगर अगर आप कुछ भी नहीं मिला है देखने के लिए बढ़ता सभी चैनलों पर पाश) –

+0

@MatthieuM। एक अवरोधक इटरेटर पर एक कैसे देख सकता है? हो सकता है कि मुझे कुछ याद आ रहा है, लेकिन क्योंकि यह अवरुद्ध हो रहा है, तब तक नियंत्रण वापस नहीं किया जाएगा जब तक कि इटरेटर की जांच की जा रही कोई वस्तु उपलब्ध न हो। ओपी के सुझाव के रूप में, आपको प्रतिरूपण अवरोधक प्रति थ्रेड बनाना होगा। – Shepmaster

+1

@ शेमपस्टर: दंडित; खुशी है कि यह केवल एक टिप्पणी थी: पी हालांकि मैंने केवल जेस्ट में सुझाव दिया है क्योंकि यह वास्तविक समाधान की तुलना में एक हैक है: x –

उत्तर

1

क्या ऐसा कुछ है जो दो अवरोधक इटरेटर्स में शामिल हो सकता है और आउटपुट प्रदान करता है क्योंकि डेटा आता है? या इस मुद्दे के लिए कोई अन्य समाधान?

हालांकि मुझे उम्मीद है कि कोई मुझे गलत साबित करता है, मुझे लगता है कि जवाब "नहीं" होना चाहिए। परिभाषा के अनुसार, कुछ ऐसा ब्लॉक जो उस थ्रेड पर किसी और काम को करने से रोक देगा। आपको ऐसा कुछ चाहिए जो "किए गए", "पढ़ने के लिए कुछ नहीं", और "कुछ पढ़ने के लिए" के बीच अंतर कर सकता है और इसे बिल्डिंग ब्लॉक के ऊपर नहीं बनाया जा सकता है जो केवल उन दो राज्यों को देता है।

मैं इनपुट के प्रत्येक स्रोत के लिए धागा बनाने और अपनी खुद की कतार का प्रबंधन करने से बचना चाहता हूं।

मुझे इसके आसपास कोई रास्ता नहीं दिख रहा है। चूंकि एक अवरुद्ध इटरेटर थ्रेड को अवरुद्ध करता है, इसलिए कई थ्रेड होने से आप "पढ़ने के लिए कुछ भी नहीं" की स्थिति को वापस जोड़ सकते हैं।

बेहतर समाधान में दोनों इनपुट स्रोतों को सभी 3 राज्यों को शामिल करना शामिल होगा।

loop { 
    if let Ok(Message::Text(text)) = receiver.recv_message() { 
     // Do some stuff 
    } else if let Err(TryRecvError::Disconnected) = kill.try_recv() { 
     break; 
    } else { 
     // Something intelligent for the other cases? 
    } 
} 
+0

मेरी इच्छा है कि वहां एक बेहतर तरीका भी था। : / –

संबंधित मुद्दे