在我的项目中,我尝试启动一个 REST API(使用 FastAPI 构建并使用 Hypercorn 运行),另外我还想在启动时启动一个 RabbitMQ Consumer(使用 aio_pika):
Aio Pika 提供了一个强大的连接,可以在失败时自动重新连接。如果我使用hypercorn app:app消费者运行下面的代码并且其余接口正确启动,但是从 aio_pika 重新连接不再起作用。如何在两个不同的进程(或线程?)中归档生产稳定的 RabbitMQ Consumer 和 RestAPI。我的 python 版本是 3.7,请注意我实际上是一个 Java 和 Go 开发人员,以防我的方法不是 Python 方式:-)
@app.on_event("startup")
def startup():
loop = asyncio.new_event_loop()
asyncio.ensure_future(main(loop))
@app.get("/")
def read_root():
return {"Hello": "World"}
async def main(loop):
connection = await aio_pika.connect_robust(
"amqp://guest:guest@127.0.0.1/", loop=loop
)
async with connection:
queue_name = "test_queue"
# Creating channel
channel = await connection.channel() # type: aio_pika.Channel
# Declaring queue
queue = await channel.declare_queue(
queue_name,
auto_delete=True
) …Run Code Online (Sandbox Code Playgroud) 基于一些 FastAPI 教程(包括本教程),我制作了一个简单的 FastAPI 应用程序:
from fastapi import FastAPI, Request
app = FastAPI() # also tried FastAPI(root_path="/api/v1")
@app.get("/app")
def read_main(request: Request):
return {"message": "Hello World", "root_path": request.scope.get("root_path")}
Run Code Online (Sandbox Code Playgroud)
我想在 root 以外的路径(例如 /api/vi)...再次基于大多数教程和常识,我尝试以以下方式启动它:
uvicorn main:app --root-path /api/v1
Run Code Online (Sandbox Code Playgroud)
服务正常(在http://127.0.0.1:8000),但是,root-path似乎被忽略:任何GET请求都会http://127.0.0.1:8000/给出:
message "Hello World"
root_path "/api/v1"
Run Code Online (Sandbox Code Playgroud)
以及任何GET要求http://127.0.0.1:8000/api/v1提供:
detail "Not Found"
Run Code Online (Sandbox Code Playgroud)
我希望这些请求会产生相反的结果......这是怎么回事?!?
我还尝试初始化 FastAPIFastAPI(root_path="/api/v1")以及切换到 hypercorn 但无济于事...
应用程序版本的详细信息(我可能也尝试过其他一些应用程序,尽管这些应该是最新尝试的):
python 3.9.7 hf930737_3_cpython conda-forge
fastapi 0.85.1 pyhd8ed1ab_0 conda-forge
uvicorn 0.20.0 py39h06a4308_0
hypercorn 0.14.3 py39hf3d152e_1 conda-forge
Run Code Online (Sandbox Code Playgroud) 我正在 Python 3.8 中尝试 Quart 和 Hypercorn。据我了解,Quart 通常用于单线程应用程序。但我看到 Hypercorn 有一个--workers运行该应用程序的选项。
workers w, --workers The number of workers to spawn and use.
Run Code Online (Sandbox Code Playgroud)
单线程应用程序如何从使用多个工作线程中受益?
我有一个Python3.9 / Quart / Hypercorn 微服务,它在配置有environment.yml 文件的conda 环境中运行。基础镜像是 Continumio/miniconda3。
由于 conda init 问题等,花了很多功夫才启动这个项目。
是否有一种更干净的方法可以在 Docker 中安装并激活 conda 环境,而不必求助于 conda run 命令并覆盖默认的 SHELL 命令?
FROM continuumio/miniconda3
COPY . /api/
WORKDIR /api/src
# See this tutorial for details https://pythonspeed.com/articles/activate-conda-dockerfile/
RUN conda env create -f /api/conda_environment_production.yml
SHELL ["conda", "run", "-n", "ms-amazing-environment", "/bin/bash", "-c"]
ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "ms-amazing-environment", "hypercorn", "--bind", "0.0.0.0:5000", "QuartAPI:app"]
EXPOSE 5000
Run Code Online (Sandbox Code Playgroud) 如果您检查Quart库,app.run()只需建立一些配置,然后使用asyncio.run(serve(self, config)),其中 serve 来自from hypercorn.asyncio import serve。
因此,即使您通过运行Quart应用程序python myapp.py,它不是已经在使用Hypercorn服务器了吗?
特别是,this 和 running via 有hypercorn myapp:app什么区别?
https://pgjones.gitlab.io/quart/deployment.html
不建议在生产中直接运行 Quart(通过 run())。相反,建议使用 Hypercorn 或替代 ASGI 服务器运行 Quart。Hypercorn 与 Quart 一起安装,默认情况下用于处理请求(例如使用 run())。
所以听起来,即使Hypercorn默认使用 来处理请求run(),也不建议使用run()? 还有人糊涂吗?