使用龙卷风发出同步请求。 RuntimeError:当另一个循环正在运行时,无法运行事件循环

时间:2020-04-06 20:58:15

标签: python web fetch tornado synchronous

我正在尝试使用Tornado发出同步请求。
尝试进行API调用。

main.py

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:当另一个循环正在运行时,无法运行事件循环
我认为这是由于IOLoop和HTTPClient引起的,但无法理解是什么问题?

1 个答案:

答案 0 :(得分:1)

我引用了documentation of HTTPClient

版本5.0中的更改:由于asyncio中的限制,在IOLoop运行时,不再可以使用同步HTTPClient。请改用AsyncHTTPClient。

请改为使用AsyncHTTPClient