Где он застрял с 300 секундами на питоне aiohttp - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть две простые службы, работающие на локальной.(код ниже).Почему ответ возвращается через очень длинные 300 секунд, когда я отправляю 100 запросов одновременно.Что он делает за кулисами?

Служба № 1, позвонив по телефону http://localhost:8080

import os
os.environ['PYTHONASYNCIODEBUG'] = '1'
import json

from aiohttp import web
import aiohttp
import asyncio
import importlib
import time

#tasks = []
n = 0
m = 0

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

async def fetch(session, url):
    try:
        async with session.get(url) as response:
        #async with getattr(session,"get")(url,proxy=proxy) as response:
            return await response.text()
    except Exception:
        import traceback
        traceback.format_exc()

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

async def runMcows(request):
    start = time.time()
    global n,m
    mcowA(m)
    m=m+1
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'http://localhost:8081')
        #html = await fetch(session, 'http://www.cpan.org/SITES.htm
    print(n,html)
    mcowB(n)
    end = time.time()
    print ( end - start)
    n=n+1

    return web.Response(text=html)

async def init():
    app = web.Application()
    app.add_routes([web.get('/', runMcows)])
    return await loop.create_server(
        app.make_handler(), '127.0.0.1', 8080)

loop = asyncio.get_event_loop()
loop.run_until_complete(init())
loop.run_forever()

Служба 2:

from aiohttp import web
import asyncio
import time

async def hello(request):
    time.sleep(5)
    #await asyncio.sleep(5)
    return web.Response(text='dummy done5')

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

web.run_app(app,host='127.0.0.1', port=8081)

Я понимаю время.(5) блокирует, но почему он блокирует 300 секунд?Какая часть тратит 300 секунд?Если изменить на await asyncio.sleep (5), он будет работать.

Некоторые выходные данные: https://github.com/aio-libs/aiohttp/issues/3630

1 Ответ

0 голосов
/ 28 февраля 2019

Это блокировка.

time.sleep(5)

Asyncio не является потоками.Выполняется цикл обработки событий, который вызывает вашу функцию hello, которая блокируется на 5 секунд перед возвратом.Затем цикл обработки восстанавливает управление и вызывает следующее событие, которое снова будет вашей функцией приветствия, которая будет блокироваться еще на 5 секунд, прежде чем вернуть управление в цикл.

Это ожидает асинхронную синхронизацию в течение 5 секунд.

await asyncio.sleep(5)

Итак, ваша функция hello возвращается немедленно и просто сообщает циклу, что нужно вернуться ко мне через 5 секунд.

...