Делать синхронные запросы с использованием Торнадо. RuntimeError: Невозможно запустить событие l oop, пока работает другое l oop - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь делать синхронные запросы, используя 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: Невозможно запустить событие l oop, пока другой l oop работает
Я чувствую, что это связано с IOL oop и HTTPClient, но не могу понять, в чем проблема?

1 Ответ

1 голос
/ 07 апреля 2020

Я цитирую документацию HTTPClient

Изменено в версии 5.0: из-за ограничений в asyncio больше невозможно использовать синхронный HTTPClient во время IOL oop работает. Вместо этого используйте AsyncHTTPClient.

Пожалуйста, используйте вместо него AsyncHTTPClient.

...