asyncio 创建任务和 aiohttp,'no running event loop'
asyncio create task and aiohttp , 'no running event loop'
我正在尝试使用 aiohttp 请求和 asyncio 任务制作 Pyqt5 应用程序。
我也在使用 quamash 包,它需要 Python 3.7,所以我安装了这个版本。(它在 Python 3.10 上不起作用)我使用 asyncio 和 quamash 的主要原因是因为我想做请求和无需冻结应用程序的 GUI。
单击“开始”按钮并关闭应用程序时出现此错误:
Task exception was never retrieved
future: <Task finished coro=<App.rotator() done, defined at C:\Users\Zsolt\Documents\python-example\stack_exmaple.py:37> exception=RuntimeError('no running event loop')>
Traceback (most recent call last):
File "C:\Users\Zsolt\Documents\python-example\stack_exmaple.py", line 41, in rotator
response = await get()
File "C:\Users\Zsolt\Documents\python-example\stack_exmaple.py", line 51, in get
async with session.get(pokemon_url) as resp:
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\client.py", line 1138, in __aenter__
self._resp = await self._coro
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\client.py", line 533, in _request
async with ceil_timeout(real_timeout.connect):
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\helpers.py", line 734, in ceil_timeout
return async_timeout.timeout(None)
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\async_timeout\__init__.py", line 30, in timeout
loop = _get_running_loop()
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\async_timeout\__init__.py", line 236, in _get_running_loop
return asyncio.get_running_loop()
RuntimeError: no running event loop
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QKeySequence, QPalette, QColor
from PyQt5.QtCore import Qt
from PyQt5 import QtGui, QtCore
import asyncio
import aiohttp
import quamash
import os.path
import json
import sys
class App(QWidget):
run = 0
response = ''
def __init__(self, loop):
super().__init__()
btn = QPushButton('Start', self)
btn.resize(btn.sizeHint())
btn.clicked.connect(self.start)
self.setGeometry(200, 200, 700, 400)
self.display = QLabel(self)
self.display.resize(200, 500)
self.display.move(1, 50)
self.count = 0
self.show()
self.loop = loop
self.tasks = []
self.tasks.append(loop.create_task(self.rotator()))
async def rotator(self):
while await asyncio.sleep(0, True):
if (self.run == 1):
self.count += 1
response = await get()
self.display.setText(str(response))
def start (self):
self.run = 1
async def get():
async with aiohttp.ClientSession() as session:
pokemon_url = 'https://pokeapi.co/api/v2/pokemon/151'
async with session.get(pokemon_url) as resp:
pokemon = await resp.json()
print(pokemon)
return pokemon
app = QApplication(sys.argv)
app.setApplicationName("Sample ;)")
loop = quamash.QEventLoop(app)
asyncio.set_event_loop(loop)
with loop:
window = App(loop)
window.show()
loop.run_forever()
如果我注释掉 response = await get()
它起作用,它会计算 self.count += 1 并在 self.display.setText(str(self.count))
上显示变量。但我需要让它与 aiohttp 请求一起工作,所以它应该打印出请求的响应。
如果使用 quamash
包:
我通过安装以前版本的 aiohttp 修复了错误
最初我安装了 aiohttp 3.8.1.dist。我也知道它之前在其他版本的 aiohttp 上对我有用,所以我查找了 pypi.org/project/aiohttp/#history 结果发现我不得不卸载 aiohttp 并安装 aiohttp==3.7.4。
命令:
pip uninstall aiohttp
pip install aiohttp==3.7.4
TLDR;将 quamash 替换为 qasync
在asyncio中,执行async代码时,任务总是存在的。就像在多线程程序中一样,至少存在主线程。如果 quamash 不遵守规则 -- 这不是 aiohttp 问题。
quamash 不再维护,最新版本是 3.5 年前发布的。
维护的继任者是 qasync,它没有这个错误并且可以完美地与最新的 aiohttp 一起工作。
我正在尝试使用 aiohttp 请求和 asyncio 任务制作 Pyqt5 应用程序。 我也在使用 quamash 包,它需要 Python 3.7,所以我安装了这个版本。(它在 Python 3.10 上不起作用)我使用 asyncio 和 quamash 的主要原因是因为我想做请求和无需冻结应用程序的 GUI。
单击“开始”按钮并关闭应用程序时出现此错误:
Task exception was never retrieved
future: <Task finished coro=<App.rotator() done, defined at C:\Users\Zsolt\Documents\python-example\stack_exmaple.py:37> exception=RuntimeError('no running event loop')>
Traceback (most recent call last):
File "C:\Users\Zsolt\Documents\python-example\stack_exmaple.py", line 41, in rotator
response = await get()
File "C:\Users\Zsolt\Documents\python-example\stack_exmaple.py", line 51, in get
async with session.get(pokemon_url) as resp:
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\client.py", line 1138, in __aenter__
self._resp = await self._coro
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\client.py", line 533, in _request
async with ceil_timeout(real_timeout.connect):
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\aiohttp\helpers.py", line 734, in ceil_timeout
return async_timeout.timeout(None)
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\async_timeout\__init__.py", line 30, in timeout
loop = _get_running_loop()
File "C:\Users\Zsolt\AppData\Local\Programs\Python\Python37\lib\site-packages\async_timeout\__init__.py", line 236, in _get_running_loop
return asyncio.get_running_loop()
RuntimeError: no running event loop
完整代码如下:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QKeySequence, QPalette, QColor
from PyQt5.QtCore import Qt
from PyQt5 import QtGui, QtCore
import asyncio
import aiohttp
import quamash
import os.path
import json
import sys
class App(QWidget):
run = 0
response = ''
def __init__(self, loop):
super().__init__()
btn = QPushButton('Start', self)
btn.resize(btn.sizeHint())
btn.clicked.connect(self.start)
self.setGeometry(200, 200, 700, 400)
self.display = QLabel(self)
self.display.resize(200, 500)
self.display.move(1, 50)
self.count = 0
self.show()
self.loop = loop
self.tasks = []
self.tasks.append(loop.create_task(self.rotator()))
async def rotator(self):
while await asyncio.sleep(0, True):
if (self.run == 1):
self.count += 1
response = await get()
self.display.setText(str(response))
def start (self):
self.run = 1
async def get():
async with aiohttp.ClientSession() as session:
pokemon_url = 'https://pokeapi.co/api/v2/pokemon/151'
async with session.get(pokemon_url) as resp:
pokemon = await resp.json()
print(pokemon)
return pokemon
app = QApplication(sys.argv)
app.setApplicationName("Sample ;)")
loop = quamash.QEventLoop(app)
asyncio.set_event_loop(loop)
with loop:
window = App(loop)
window.show()
loop.run_forever()
如果我注释掉 response = await get()
它起作用,它会计算 self.count += 1 并在 self.display.setText(str(self.count))
上显示变量。但我需要让它与 aiohttp 请求一起工作,所以它应该打印出请求的响应。
如果使用 quamash
包:
我通过安装以前版本的 aiohttp 修复了错误 最初我安装了 aiohttp 3.8.1.dist。我也知道它之前在其他版本的 aiohttp 上对我有用,所以我查找了 pypi.org/project/aiohttp/#history 结果发现我不得不卸载 aiohttp 并安装 aiohttp==3.7.4。
命令:
pip uninstall aiohttp
pip install aiohttp==3.7.4
TLDR;将 quamash 替换为 qasync
在asyncio中,执行async代码时,任务总是存在的。就像在多线程程序中一样,至少存在主线程。如果 quamash 不遵守规则 -- 这不是 aiohttp 问题。
quamash 不再维护,最新版本是 3.5 年前发布的。 维护的继任者是 qasync,它没有这个错误并且可以完美地与最新的 aiohttp 一起工作。