Выполнение асинхронных запросов в приложении flask - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь создать простого бота в flask и ускорить его с помощью asyncio. Ниже я попытался упростить мой код, но вот общая цель того, чего я пытаюсь достичь:

  1. Пользователь может отправить до 50 URL-адресов, которые следует проанализировать

  2. Бот разделяет URL-адреса между 5 работниками

  3. Бот открывает в основном 5 веб-сайтов одновременно

  4. бот извлекает весь текст и добавляет его в список

  5. Шаги 3 и 4 повторяются до тех пор, пока все веб-сайты, предоставленные пользователем, не будут просканированы

  6. список со всеми текстами до 50 URL-адресов передается в Rapid Automati c Извлечение ключевого слова (RAKE: https://github.com/csurfer/rake-nltk)

  7. RAKE извлекает ключевые слова ранжирует их и помещает в словарь

  8. Словарь передается обратно пользователю

Мой текущий код возвращает эту ошибку:

RuntimeError: There is no current event loop in thread 'Thread-2'.

Буду очень благодарен за каждое предложение. Я до сих пор не очень понимаю, как работает asyncio, но попытался сделать его аналогом некоторых других кодов, которые я нашел. По сути, я просто хочу запросить несколько URL-адресов параллельно, и это кажется таким простым, но я не могу его реализовать. Заранее спасибо за помощь.

Вот мой код:

    from flask import Flask
    from bs4 import BeautifulSoup
    from rake_nltk import Rake
    import asyncio
    import aiohttp 

    app =

    Flask(__name__)

    r = Rake()

    # To simplify I just added 5 URLs instead of 50 in this list

    urls = [ "https://www.washingtonpost.com", "https://en.wikipedia.org/wiki/Severe_acute_respiratory_syndrome_coronavirus_2", "https://www.welt.de", "https://www.faz.net/aktuell/", "https://www.sueddeutsche.de" ] 

    async def fetch(url, session):
        async with session.get(url) as response:
            html = await response.read()
            return html

    @app.route("/")
    def fetch_things():
        text = []
        session = aiohttp.ClientSession()
        tasks = [asyncio.ensure_future(fetch(url, session)) for url in urls]
        loop = asyncio.get_event_loop()
        responses = loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True))
        for i in responses:
            soup = BeautifulSoup(i.content, 'lxml')
            souptxt = soup.text()

            # I will remove all stopwords with this function 
            souptxt = remove_stopwords(souptxt)
            text.append(souptxt)
        keywords = r.extract_keywords_from_text(text)
        ranked = r.get_ranked_phrases_with_scores()
        loop.close()
        return ranked

    if __name__ == '__main__':
        app.run(debug=True)
...