Python 等待一个内部有循环的函数

标签 python python-3.x web parallel-processing sanic

我正在使用Sanic作为服务器并尝试同时处理多个请求。

我已经使用了await作为编码函数(我使用for循环来模拟做某事),但是当我在两个单独的控制台中尝试时间curl http://0.0.0.0:8000/时,它不会同时运行。

我搜索了google,但只找到了event_loop,但它是为了调度注册的并发例程。

如何等待 for 循环以使请求不会被阻止?

谢谢。

from sanic import Sanic
from sanic import response
from signal import signal, SIGINT
import asyncio
import uvloop

app = Sanic(__name__)


@app.route("/")
async def test(request):
    # await asyncio.sleep(5)
    await encode()
    return response.json({"answer": "42"})

async def encode():
    print('encode')
    for i in range(0, 300000000):
        pass

asyncio.set_event_loop(uvloop.new_event_loop())
server = app.create_server(host="0.0.0.0", port=8000)
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(server)
signal(SIGINT, lambda s, f: loop.stop())
try:
    loop.run_forever()
except:
    loop.stop()

最佳答案

运行for i in range() 会阻塞。如果您将其更改为将 await asyncio.sleep(5) 放入 encode 方法中,您将看到它按预期运行。

@app.route("/")
async def test(request):
    await encode()
    return response.json({"answer": "42"})

async def encode():
    print('encode')
    await asyncio.sleep(5)

当你调用awaitencode()并且encode是一个阻塞方法时,它仍然会阻塞,因为你没有“等待”任何其他东西。您的线程仍然被锁定。

您还可以添加其他工作人员:

app.create_server(worker=2)

尝试查看this answer

关于Python 等待一个内部有循环的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094459/

相关文章:

javascript - 动态创建的按钮上的单击事件

python - 如何在 EC2 实例中使用 boto3

python - 为什么不能在 __init__ 关键字参数中使用类变量?

python - 无法将我的数据写入文件?我看不到错误

javascript - 当文件完成上传到服务器时,Javascript 可以关闭窗口吗?

java - JBoss - Spring Web 项目 - 需要在 URL 中包含 jsessionid 以在 JBoss 集群解决方案中保持粘性

python - PySide Qt : Auto vertical growth for TextEdit Widget, 和垂直布局中小部件之间的间距

python - 获取用于运行当前 Python 脚本的 Python 命令

python - 如何使用静态方法作为策略设计模式的默认参数?

python - 从 IDLE 运行时为 "GetPassWarning: Can not control echo on the terminal"