Неверный простой асинхронный скрипт (python 3.5) - PullRequest
0 голосов
/ 27 сентября 2018

У меня такой простой код.

from aiohttp import web

async def hello(request):
    print('Start')
    for el in range(30000000):
        # Any expression
        1+el/10000*100000-4*234

    print('Stop')
    return web.Response(text="Hello, world")


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

web.run_app(app)

Когда я открываю свой браузер в http://0.0.0.0:8080/,, я получаю текст «Пуск», а затем через ~ 10 секунд я получаю текст »Стоп".Затем я открываю две страницы http://0.0.0.0:8080/ одновременно.Я ожидаю получить такие тексты в течение 10-11 секунд

'Start' #right now
'Start' #right now
'Stop' #in 10 sec
'Stop' #next sec

Но я получаю (в течение 21 секунды)

'Start' #right now
'Stop' #in 10 sec
'Start' #at 11th sec
'Stop' #at 22th sec

Что я делаю не так?

1 Ответ

0 голосов
/ 27 сентября 2018

У вас есть код, связанный с процессором:

for el in range(30000000):
    # Any expression
    1+el/10000*100000-4*234

Он блокирует выполнение цикла событий.

Чтобы решить эту проблему, переместите такой код в исполнитель пула потоков.

Фиксированный пример:

import asyncio
from aiohttp import web

def long_running_cpu_bound_task():
    for el in range(30000000):
        # Any expression
        1+el/10000*100000-4*234

async def hello(request):
    print('Start')
    await asyncio.get_event_loop().run_in_executor(
        None,
        long_running_cpu_bound_task)
    print('Stop')
    return web.Response(text="Hello, world")


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

web.run_app(app)
...