2017-07-07 9 views
5

मेरे पास discord.py के साथ बनाया गया एक अजगर डिस्कॉर्ड बॉट है, जिसका अर्थ है कि पूरा प्रोग्राम एक ईवेंट लूप के अंदर चलता है।पाश खत्म होने से पहले पायथन कोरआउट से परिणाम एकत्रित करना

जिस फ़ंक्शन पर मैं काम कर रहा हूं जिसमें कई सौ HTTP अनुरोध हैं और परिणाम को अंतिम सूची में शामिल करना शामिल है। इन्हें क्रम में करने में लगभग दो मिनट लगते हैं, इसलिए मैं उन्हें एसिंक बनाने के लिए aiohttp का उपयोग कर रहा हूं। मेरे कोड के संबंधित भाग Aiohttp दस्तावेज़ों में क्विकस्टार्ट उदाहरण के समान हैं, लेकिन यह एक रनटाइम त्रुटि को फेंक रहा है: सत्र बंद है। 'एकाधिक URL प्राप्त करने' के तहत https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html पर एक उदाहरण से पद्धति ली गई थी।

async def searchPostList(postUrls, searchString) 
    futures = [] 
    async with aiohttp.ClientSession() as session: 
     for url in postUrls: 
      task = asyncio.ensure_future(searchPost(url,searchString,session)) 
      futures.append(task) 

    return await asyncio.gather(*futures) 


async def searchPost(url,searchString,session)): 
    async with session.get(url) as response: 
     page = await response.text() 

    #Assorted verification and parsing 
    Return data 

मुझे नहीं पता कि यह त्रुटि क्यों बदलती है क्योंकि मेरा कोड दो संभवतः कार्यात्मक उदाहरणों के समान है। इवेंट लूप स्वयं ठीक काम कर रहा है। यह हमेशा के लिए चलता है, क्योंकि यह एक बॉट आवेदन है।

उत्तर

4

उदाहरण के साथ आप जुड़े हुए उदाहरण में async with ब्लॉक के भीतर परिणाम एकत्रित किया गया था। यदि आप इसे बाहर करते हैं, तो इस बात की कोई गारंटी नहीं है कि अनुरोध किए जाने से पहले सत्र बंद नहीं होगा!

ब्लॉक के अंदर अपना वापसी कथन बढ़ते काम करना चाहिए:

async with aiohttp.ClientSession() as session: 
     for url in postUrls: 
      task = asyncio.ensure_future(searchPost(url,searchString,session)) 
      futures.append(task) 

     return await asyncio.gather(*futures) 
+0

वाह! वह पूरी तरह से मेरे दिमाग फिसल गया। हाहाहा, आप बता सकते हैं कि मैं कितना नया एसिंक हूं। आपकी त्वरित सहायता के लिए धन्यवाद! – user3896248

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