python - 使用 Tornado 发出同步请求。RuntimeError:在另一个循环正在运行时无法运行事件循环
问题描述
我正在尝试使用 Tornado 发出同步请求。
试图进行 API 调用。
主文件
import tornado.web
import tornado.httpserver
import tornado.options
import tornado.ioloop
from tornado.web import url
from handlers import IndexHandler
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
url(r"/", IndexHandler),
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
我的 handlers.py 是...
import tornado.web
import tornado.httpclient
import urllib
import json
import datetime
import time
class IndexHandler(tornado.web.RequestHandler):
def get(self):
query = self.get_argument('q')
client = tornado.httpclient.HTTPClient()
response = client.fetch("https://pokeapi.co/api/v2/pokemon/" + urllib.urlencode(("query")))
print(response)
if response == "Not Found":
self.write("Invalid Input")
response_data = json.loads(response.body)
pikachu_name = response_data['name']
pikachu_order = response_data['order']
self.write("""
Pickachu Name: %s <br>
Pickachu Order: %d <br>
""" %(pikachu_name, pikachu_order))
现在我面临的问题是
[E 200407 02:18:37 web:1792] Uncaught exception GET /?q=pikachu (::1)
HTTPServerRequest(protocol='http', host='localhost:8000', method='GET', uri='/?q=pikachu', version='HTTP/1.1', remote_ip='::1')
Traceback (most recent call last):
File "C:\Python\Python37\lib\site-packages\tornado\web.py", line 1701, in _execute
result = method(*self.path_args, **self.path_kwargs)
File "C:\Users\Bagga\Documents\tornado\Tweet Rate\handlers.py", line 12, in get
client = tornado.httpclient.HTTPClient()
File "C:\Python\Python37\lib\site-packages\tornado\httpclient.py", line 107, in __init__
self._async_client = self._io_loop.run_sync(make_client)
File "C:\Python\Python37\lib\site-packages\tornado\ioloop.py", line 526, in run_sync
self.start()
File "C:\Python\Python37\lib\site-packages\tornado\platform\asyncio.py", line 149, in start
self.asyncio_loop.run_forever()
File "C:\Python\Python37\lib\asyncio\base_events.py", line 529, in run_forever
'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running
[E 200407 02:18:37 web:2250] 500 GET /?q=pikachu (::1) 55.85ms
问题是什么,我该如何解决?
我在这里可以看到的主要错误是,
RuntimeError: Cannot run the event loop while another loop is running
我觉得这是由于 IOLoop 和 HTTPClient,但不明白是什么问题?
解决方案
我引用的文档HTTPClient
在 5.0 版更改: 由于 asyncio 的限制,在 IOLoop 运行时不再可能使用同步 HTTPClient。请改用 AsyncHTTPClient。
请AsyncHTTPClient
改用。
推荐阅读
- css - 当 flex 项大于 flex 容器时,我可以将 flexbox 项缩小到相同的大小吗?
- ionic-framework - Ionic 4:设备问题构建
- node.js - 无法使用 mocha、chai 和 supertest 运行单元测试用例,得到:- 错误:ECONNREFUSED:连接被拒绝
- excel - Excel VBA Do While循环在目录文件夹和行数中
- scikit-learn - 使用 scikit learn 进行标签编码时如何保持自然顺序
- typescript - 如何基于类泛型定义泛型接口
- flutter - scoped_model 的用途/提供包(如果内置状态管理有效)
- php - ssh2_connect 定义显式 TLS
- postgresql - 在安装了 PostgreSQL 12.1 的 MacOS catalina 上的 virtualenv 中安装 psycopg2 是否有任何问题?
- html - 如何模糊背景