Flask asyncio aiohttp - RuntimeError:线程'Thread-2'

最近一直在阅读有关 python 并发的内容 realpython - python concurrency


我的主要关注asyncio点是相当新的。


执行异步活动的代码块使用asyncio并aiohttp在直接运行时运行良好。


但是,当我将代码添加到我的烧瓶蓝图时,它会引发此错误:


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


出于演示目的,我制作了一个演示烧瓶应用程序。万一有人想测试一下。


main.py


from flask import Flask

from my_blueprint import my_blueprint


#Define flask app

app = Flask(__name__)


#load blueprints

app.register_blueprint(my_blueprint,url_prefix='/demo')


#start flask

if __name__ == '__main__':

    app.run(debug=True)

my_blueprint.py


from flask import Blueprint,request, jsonify,abort,make_response

from flask import make_response

import asyncio

import time

import aiohttp


my_blueprint = Blueprint('my_blueprint', __name__)


@my_blueprint.route('/',methods=['GET'])

def home():

    #code block

    async def download_site(session, url):

        async with session.get(url) as response:

            print("Read {0} from {1}".format(response.content_length, url))



    async def download_all_sites(sites):

        async with aiohttp.ClientSession() as session:

            tasks = []

            for url in sites:

                task = asyncio.ensure_future(download_site(session, url))

                tasks.append(task)

            await asyncio.gather(*tasks, return_exceptions=True)


    sites = ["https://www.jython.org","http://olympus.realpython.org/dice"]*20

    start_time = time.time()

    asyncio.get_event_loop().run_until_complete(download_all_sites(sites))

    duration = time.time() - start_time

    return jsonify({"status":f"Downloaded {len(sites)} sites in {duration} seconds"})

    #end of code block


慕斯王
浏览 219回答 1
1回答

牧羊人nacy

编辑:看起来你的代码是正确的。我习惯写不同的。但是您可能正在运行 Windows 和 Python 3.8。这只是改变了 Windows 上 python 3.8 中的默认事件循环策略,而且它很容易出错。您可以改回旧的事件循环策略:改变:asyncio.get_event_loop().run_until_complete(download_all_sites(sites))进入:asyncio.set_event_loop(asyncio.SelectorEventLoop())asyncio.get_event_loop().run_until_complete(download_all_sites(sites))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python