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

时间:2018-05-08 23:09:26

标签: 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())

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

RuntimeError:此事件循环已在运行

<!doctype html>"

...(更多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()

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

RuntimeError:此事件循环已在运行

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

来自个人代码段的结果(从cmd&#34运行; python personal_snippet.py&#34;):

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

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

我有两个问题:

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

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

  2. 鉴于我有两个打印命令(在第二段代码中)并且只有一组&#34;数据&#34;打印,然后为什么数据没有回到原始调用(结果= loop.run_until_complete(get_async_urls(urls)))(可能的回答:在SPYDER3中可能的错误)

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

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

    感谢您的帮助!

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

4 个答案:

答案 0 :(得分:2)

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

我向Spyder3提交了一个错误。

答案 1 :(得分:2)

在我看来Spyder运行自己的事件循环。您不能在单个线程中运行两个事件循环。

asyncio.run(coro,*,debug = False)

在以下情况下无法调用此函数 另一个异步事件循环正在同一线程中运行。

这对我有用。如果没有其他正在运行的循环,我将启动自己的循环:

import asyncio

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    await say_after(2, 'done')

await say_after(1, 'ahoy')    

loop = asyncio.get_event_loop()
print(loop) # <_WindowsSelectorEventLoop running=True closed=False debug=False>
if loop.is_running() == False:
    asyncio.run(main())
else:
    await main()

答案 2 :(得分:1)

也许我很幸运,但我降级了龙卷风。见"Can't invoke asyncio event_loop after tornado 5.0 update"

答案 3 :(得分:1)

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

使用命令安装nest_asyncio

pip install nest_asyncio

在文件中添加以下几行

import nest_asyncio
nest_asyncio.apply()

这个问题必须解决。


从文档的

  

根据设计,asyncio不允许嵌套其事件​​循环。这带来了一个实际的问题:在事件循环已经在运行的环境中,无法运行任务并等待结果。尝试这样做将出现错误“ RuntimeError:此事件循环已在运行”。

     

该问题在各种环境中弹出,例如Web服务器,GUI   应用程序以及Jupyter笔记本中。

     

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