"RuntimeError:此事件循环已在运行"; 在python 3.6.5中调试aiohttp,asyncio和IDE"spyder3"

Rya*_*ner 5 python spyder python-asyncio aiohttp

我很难理解为什么我得到"RuntimeError:此事件循环已经在运行"运行时错误.我试图从" https://aiohttp.readthedocs.io/en/stable/ " 运行代码片段但是,我一直遇到同样的问题.

教程中的代码片段:


import aiohttp
import asyncio
import async_timeout

async def fetch(session, url):
    async with async_timeout.timeout(10):
        async with session.get(url) as response:
            return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://python.org')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Run Code Online (Sandbox Code Playgroud)

教程片段的结果(从spyder IDE运行代码时):


RuntimeError:此事件循环已在运行

<!doctype html>"
Run Code Online (Sandbox Code Playgroud)

...(更多HTML)


个人代码段(不是上面引用的教程):


import aiohttp
import asyncio
import time

urls = ['https://api.robinhood.com/quotes/c4f6720a-0364-4e7b-8c41-705696759e1a/']

async def fetch(client, url):
    async with client.request('get', url) as response:
        if response.status == 200:
            data = await response.text()
        else:
            data = []
        print(data)
        return(data)

async def get_async_urls(urls):
    async with aiohttp.ClientSession() as client:
        return await asyncio.gather(*(fetch(client, url) for url in urls))

if __name__ == '__main__':
    t0 = time.time()
    loop = asyncio.get_event_loop()
    results = loop.run_until_complete(get_async_urls(urls))
    print(results)
    t1 = time.time()
    total_time = t1-t0
    loop.close()
Run Code Online (Sandbox Code Playgroud)

来自个人代码段的结果(从spyder IDE运行代码时):


RuntimeError:此事件循环已在运行

{ "ask_price": "14.9000", "ask_size":100, "bid_price": "14.0100", "bid_size":100, "last_trade_price": "14.7900", "last_extended_hours_trade_price": "14.7900", "previous_close":" 14.3600" , "adjusted_previous_close": "14.3600", "previous_close_date": "2018年5月7日", "符号": "SURF", "trading_halted":假的, "has_traded":真实的, "last_trade_price_source": "合并" ,"updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}


来自个人代码段的结果(从cmd"python personal_snippet.py"运行时):


{ "ask_price": "14.9000", "ask_size":100, "bid_price": "14.0100", "bid_size":100, "last_trade_price": "14.7900", "last_extended_hours_trade_price": "14.7900", "previous_close":" 14.3600" , "adjusted_previous_close": "14.3600", "previous_close_date": "2018年5月7日", "符号": "SURF", "trading_halted":假的, "has_traded":真实的, "last_trade_price_source": "合并" ,"updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "} ['{" ask_price ":" 14.9000" , "ask_size":100, "bid_price": "14.0100", "bid_size":100, "last_trade_price": "14.7900", "last_extended_hours_trade_price": "14.7900", "previous_close": "14.3600" "adjusted_previous_close": "14.3600", "previous_close_date": "2018年5月7日", "符号": "SURF", "trading_halted":假的, "has_traded":真实的, "last_trade_price_source": "合并"," updated_at":"2018-05-08T20:01:21Z","instrument":" https://api.robinhood.com/instruments/43d56335-f2f6-4711-b650-55be2396f814/ "}']


上述结果似乎表明该问题与Spyder IDE有关.


我有两个问题:

  1. 为什么我收到此错误? 在运行教程代码时,似乎其他人不会收到此错误.(可能回答:在SPYDER3中可能出现的问题)

    这似乎只发生在spyder IDE中.我从cmd提示符下运行了两段代码,没有出现错误.感谢@MikhailGerasimov提出的建议.

  2. 鉴于我有两个打印命令(在第二段代码中)并且只打印了一组"数据",那么为什么数据不会回到原始调用(results = loop.run_until_complete(get_async_urls(urls)) )(潜在回答:在SPYDER3中可能的错误)

    这似乎只发生在spyder IDE中.我从cmd提示符中运行了第二段代码,然后出现了两个打印件.感谢@MikhailGerasimov提出的建议.




两个问题都有(可能)已经回答了.当我向spyder IDE提交问题时,我会引用这个问题.随着事情的发展,我将继续更新这一点.如果他们回来并说问题不在于他们,那么我将以稍微不同的格式重新打开问题.

谢谢您的帮助!




链接到Spyder IDE的github中引用的问题提交:https: //github.com/spyder-ide/spyder/issues/7096




Raj*_*ddy 8

我对 Spyder 有同样的问题,唯一对我有用的解决方案是使用nest_asyncio

使用命令安装 nest_asyncio

pip install nest_asyncio
Run Code Online (Sandbox Code Playgroud)

在您的文件中添加以下几行

import nest_asyncio
nest_asyncio.apply()
Run Code Online (Sandbox Code Playgroud)

而且这个问题必须解决。


从文档的

按照设计,asyncio 不允许嵌套其事件​​循环。这提出了一个实际问题:当在事件循环已经运行的环境中时,不可能运行任务并等待结果。尝试这样做会给出错误“RuntimeError:此事件循环已经在运行”。

该问题会在各种环境中出现,例如 Web 服务器、GUI 应用程序和 Jupyter 笔记本。

此模块修补 asyncio 以允许嵌套使用 asyncio.run 和 loop.run_until_complete。


Rya*_*ner 3

该问题似乎与所使用的 IDE (Spyder3) 有关。昨晚我尝试使用 PyCharm 社区版运行代码。代码运行没有任何问题。

我已向 Spyder3 提交了一个错误。