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有关.
我有两个问题:
为什么我收到此错误? 在运行教程代码时,似乎其他人不会收到此错误.(可能回答:在SPYDER3中可能出现的问题)
这似乎只发生在spyder IDE中.我从cmd提示符下运行了两段代码,没有出现错误.感谢@MikhailGerasimov提出的建议.
鉴于我有两个打印命令(在第二段代码中)并且只打印了一组"数据",那么为什么数据不会回到原始调用(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
我对 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。
| 归档时间: |
|
| 查看次数: |
2661 次 |
| 最近记录: |