Я бы хотел запустить сервер Tornado вместе с независимой долгосрочной задачей в asyncio
в Python 3.7. Я новичок в asyncio
. Я читал, что вы должны вызывать asyncio.run()
только один раз, поэтому я собрал обе задачи в рамках метода main()
, чтобы я мог передать один аргумент asyncio.run()
. Когда я запускаю этот код, я получаю ошибку TypeError: a coroutine was expected, got <function start_tornado at 0x105c8e6a8>
. Я хотел бы, чтобы код работал без ошибок, но в конечном итоге я хочу знать, как сделать это правильно. Код, который я написал ниже, выглядит как уродливый хак.
import asyncio
import datetime
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
# Fake background task I got from here:
# https://docs.python.org/3/library/asyncio-task.html#sleeping
async def display_date():
while True:
print(datetime.datetime.now())
await asyncio.sleep(1)
async def start_tornado():
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
async def main():
await asyncio.create_task(start_tornado)
await asyncio.create_task(display_date)
asyncio.run(main())