我很难理解为什么我得到" 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有关。
我有两个问题:
为什么我收到此错误? 在运行教程代码时,似乎其他人不会收到此错误。 (可能回答:在SPYDER3中可能出现的错误)
这似乎只发生在spyder IDE中。我从cmd提示符下运行了两段代码,没有出现错误。感谢@MikhailGerasimov的建议。
鉴于我有两个打印命令(在第二段代码中)并且只有一组&#34;数据&#34;打印,然后为什么数据没有回到原始调用(结果= loop.run_until_complete(get_async_urls(urls)))(可能的回答:在SPYDER3中可能的错误)
这似乎只发生在spyder IDE中。我从cmd提示符中运行了第二段代码,然后出现了两个打印件。感谢@MikhailGerasimov的建议。
两个问题都有(可能)已经回答了。当我向spyder IDE提交问题时,我会引用这个问题。随着事情的发展,我将继续更新这一点。如果他们回来并说问题不在于他们,那么我将以稍微不同的格式重新打开问题。
感谢您的帮助!
链接到Spyder IDE&#39; github中引用的问题提交: https://github.com/spyder-ide/spyder/issues/7096
答案 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。