首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误的简单异步脚本(python 3.5)

错误的简单异步脚本(python 3.5)
EN

Stack Overflow用户
提问于 2018-09-27 05:37:36
回答 1查看 57关注 0票数 1

我有一个如此简单的代码。

代码语言:javascript
复制
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/中打开我的浏览器时,我得到了文本"Start",然后大约10秒后,我得到了文本"Stop“。然后我同时打开两个页面的http://0.0.0.0:8080/。我希望在10-11秒内收到这样的短信

代码语言:javascript
复制
'Start' #right now
'Start' #right now
'Stop' #in 10 sec
'Stop' #next sec

但我得到(在21秒内)

代码语言:javascript
复制
'Start' #right now
'Stop' #in 10 sec
'Start' #at 11th sec
'Stop' #at 22th sec

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-09-27 20:54:15

你有一个CPU绑定的代码:

代码语言:javascript
复制
for el in range(30000000):
    # Any expression
    1+el/10000*100000-4*234

它会阻止事件循环的执行。

要解决此问题,请将这些代码移动到线程池执行器中。

修复后的示例:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52526347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档