1

我有这么简单的代码。

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

我究竟做错了什么?

4

1 回答 1

1

您有一个受 CPU 限制的代码:

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)
于 2018-09-27T12:54:14.583 回答