2015-12-29 8 views
5

के साथ किया गया था मेरे पास दो StreamReader ऑब्जेक्ट्स हैं और इन्हें लूप में पढ़ना है। मैं asyncio.wait उपयोग कर रहा हूँ इस तरह:कैसे पता चलेगा कि कौन सा कोरआउटिन asyncio.wait()

done, pending = await asyncio.wait(
    [reader.read(1000), freader.read(1000)], 
    return_when=asyncio.FIRST_COMPLETED) 

अब done.pop() मुझे भविष्य है कि पहले समाप्त हो देता है। समस्या यह है कि मुझे नहीं पता कि read() ऑपरेशन कैसे पूरा हुआ। मैंने [reader.read(1000), freader.read(1000)] को tasks चर में डालने और उन लोगों के साथ किए गए भविष्य की तुलना करने की कोशिश की। लेकिन ऐसा गलत लगता है क्योंकि पूरा भविष्य मूल कार्यों में से कोई भी बराबर नहीं है। तो मुझे यह पता लगाना चाहिए कि कौन सा कोरआउट समाप्त हो गया था?

+0

आपको अपनी कॉल से कार्यों को बनाने और * * * को 'प्रतीक्षा' करने के लिए - उदाहरण देखें [यह उदाहरण] (https://websockets.readthedocs.org/en/stable/intro.html#both)। – jonrsharpe

+0

@jonrsharpe हाँ। उसने ऐसा किया। धन्यवाद। एक उत्तर के रूप में पोस्ट करने की देखभाल? – Elektito

+0

जॉली अच्छा, करेंगे। – jonrsharpe

उत्तर

5

आपको प्रत्येक .read कॉल के लिए एक अलग कार्य बनाने की आवश्यकता है, और उन कार्यों को .wait पर पास करें। फिर आप देख सकते हैं कि कार्य परिणाम में हैं।

reader_task = asyncio.ensure_future(reader.read(1000)) 
... 

done, pending = await asyncio.wait(
    [reader_task, ...], 
    return_when=asyncio.FIRST_COMPLETED, 
) 

if reader_task in done: 
    ... 

... 

उदा। websockets दस्तावेज़ीकरण से।

+1

कृपया ध्यान दें कि एक आम गलती यह है कि 'asyncio.wait' को रद्द कर दिया जा सकता है (आमतौर पर जब युक्त कोरआउटिन रद्द कर दिया जाता है) लेकिन यह जो कार्य बनाता है (या जिन्हें आप बनाते हैं और पास करते हैं) ** नहीं हैं * *। मैं आमतौर पर ''try' /' अंत 'के साथ अपने' asyncio.wait' कॉल को लपेटकर अंततः कार्य को रद्द कर देता हूं। इस समय परेशान और खराब दस्तावेज। – ereOn

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

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