Asyncio не работает при прослушивании HTTP-запроса - PullRequest
0 голосов
/ 05 октября 2018

Я использую aiohttp как мой сервер.Когда приходит запрос, я пытаюсь запустить процесс для его обработки.Но я получаю следующую ошибку:

Traceback (последний вызов был последним): файл «asyncppx.py», строка 33, в app.add_routes ([web.get ('/', asyncio.sure_future (runMcows (n)))]) Файл "/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_app.py", строка 231, в add_routes self.routerФайл .add_routes (routs) "/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py", строка 966, в файле add_routes route_obj.register (self) "/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_routedef.py ", строка 38, в регистре reg (self.path, self.handler, ** self.kwargs) Файл "/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py", строка 922, в add_get resource.add_route (hdrs.METH_HEAD, обработчик, **kwargs) Файл "/Users/i3ye/Programming/vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py", строка 269, в файле add_route hope_handler = hope_handler) "/ Users / i3ye /Programming / vsc / async / env / lib / python3.6 / site-packages / aiohttp / web_urldispatcher.py ", строка 682, в init resource = resource) файле" / Users / i3ye / Programming / vsc/async/env/lib/python3.6/site-packages/aiohttp/web_urldispatcher.py ", строка 103, в init assert callable (обработчик), обработчик AssertionError:> Задача была уничтожена, но ожидает выполнения!task:> sys: 1: RuntimeWarning: сопрограмма 'runMcows' никогда не ожидалась

Код ниже, есть предложения?

from aiohttp import web
import aiohttp
import asyncio

loop = asyncio.get_event_loop()

#tasks = []
n = 0

def mcowA(n):
   print (n, " : A") 
   return

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

def mcowB(n):
   print (n, " : B") 
   return

async def runMcows(n):
    mcowA(n)
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://localhost:8081')
    mcowB(n)
    return html


try:
    app = web.Application()
    app.add_routes([web.get('/', asyncio.ensure_future(runMcows(n)))])
    loop.run_forever()
    web.run_app(app)
finally:
    loop.close()

1 Ответ

0 голосов
/ 06 октября 2018

Если вы посмотрите на пример сервера здесь :

Ваш код должен быть таким в основном исполнении:

app = web.Application()
app.add_routes([web.get('/', runMcows])
web.run_app(app)

app.add_routes Вам нужнопередать сопрограмму runMcows, которая может принимать только 1 переменную, сам запрос.

async def runMcows(request):
    mcowA(n)
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://localhost:8081')
    mcowB(n)
    return web.Response(text=html)  # Change this response type based on what you need.
...