我有 FastAPI (Python) 和 uvicorn[标准]。我有这个错误:
error walking file system: OSError [Errno 40] Too many levels of symbolic links: '/sys/class/vtconsole/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0/subsystem/vtcon0'
Run Code Online (Sandbox Code Playgroud)
如果我只使用 uvicorn,一切都可以,但我需要 uvicorn[standard]。如何修复它?
我在 Docker 中使用它。
我想统计特定 URL 路径中的请求数。
app = FastAPI()
counter = 0
@app.get("/do_something")
async def do_something():
global counter
counter += 1
return {"message": "Hello World"}
Run Code Online (Sandbox Code Playgroud)
这段代码可以吗?计数器应该是线程安全的?阿辛西奥安全吗?这是计算请求的正确方法(没有数据库)吗?在这种情况下,“do_something”函数中的“async”有含义吗?以及如何让它与多个工人一起工作?
我是学习 FastAPI 的新手,一开始就陷入困境。我不断收到以下错误:
(venv) root@Xue:/home/proyectos/FastAPI# uvicorn main.py:app --reload
Traceback (most recent call last):
File "/usr/bin/uvicorn", line 6, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3254, in <module>
def _initialize_master_working_set():
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3237, in _call_aside
f(*args, **kwargs)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 3266, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 584, in _build_master
ws.require(__requires__)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 901, in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 787, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'uvloop>=0.14.0' distribution was not found …Run Code Online (Sandbox Code Playgroud) from fastapi import FastAPI\nfrom fastapi.middleware.cors import CORSMiddleware\nimport uvicorn\nimport time\nfrom loguru import logger\nfrom apscheduler.schedulers.background import BackgroundScheduler\n\napp = FastAPI()\napp.add_middleware(\n CORSMiddleware,\n allow_origins=["*"],\n allow_credentials=True,\n allow_methods=["*"],\n allow_headers=["*"],\n)\n\ntest_list = ["1"]*10\n\ndef check_list_len():\n global test_list\n while True:\n time.sleep(5)\n logger.info(f"check_list_len\xef\xbc\x9a{len(test_list)}")\n\n@app.on_event('startup')\ndef init_data():\n scheduler = BackgroundScheduler()\n scheduler.add_job(check_list_len, 'cron', second='*/5')\n scheduler.start()\n\n@app.get("/pop")\nasync def list_pop():\n global test_list\n test_list.pop(1)\n logger.info(f"current_list_len:{len(test_list)}")\n\n\nif __name__ == '__main__':\n uvicorn.run(app="main3:app", host="0.0.0.0", port=80, reload=False, debug=False)\nRun Code Online (Sandbox Code Playgroud)\n上面是我的代码,我想通过get请求取出一个列表元素,并设置一个周期性任务不断检查列表中的元素数量,但是当我运行时,总是出现以下错误:
\nExecution of job "check_list_len (trigger: cron[second='*/5'], next run at: 2021-11-25 09:48:50 CST)" skipped: maximum number of running instances reached (1)\n2021-11-25 09:48:50.016 | INFO | …Run Code Online (Sandbox Code Playgroud) 我正在使用 EC2 AWS 实例中托管的 FastAPI。
EC2 实例规格(g4dn.xlarge):16 GB 内存,4 个 CPU,GPU:NVIDIA T4
我正在对该应用程序进行压力测试。如果我向应用程序同时发送 10 个 POST 请求,则只有 5 个请求同时(完全相同的时间)得到处理,而其他请求则在不同的时间(几秒钟后)一一处理。
配置如下
gunicorn main:app --workers 9 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
Run Code Online (Sandbox Code Playgroud)
workers根据这个公式,我已将 9 设置为 9The suggested maximum concurrent requests when using workers and threads is (2*CPU)+1.
鉴于上述配置,我希望能够同时处理所有 10 个请求。
对于 9 个工作人员,即使我清理了缓存,我也会遇到 CUDA 内存不足错误。
有 3 个工作人员时,我不会遇到 CUDA 问题,但同时处理的请求只有 3 个,仅此而已。其余的将在几秒钟后一一处理。
我有一个使用 uvicorn 的 Python FastAPI 应用程序。我把它打包在 docker 容器中。当我使用如下命令运行应用程序(在 Windows 10 计算机上的 Power Shell 中)时:docker run -p 8080:8080 my-image-name我收到以下 uvicorn 启动文本:
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
Run Code Online (Sandbox Code Playgroud)
当我按CTRL+C杀死该应用程序时,什么也没有发生。我总是最终不得不关闭终端才能让它停止。
这是因为它在 docker 容器中运行吗?
我知道我可以在分离模式 ( ) 下运行容器-d,但有时我想在容器日志发生时观察它们。
如何终止 docker 映像和 uvicorn 进程并保持终端仍在运行?
基于一些 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) 我正在使用由 Uvicorn 服务器提供服务的 FastAPI 框架。我的应用程序应该在给定的端点 (/run) 上运行一些耗时的数值计算。为此,我使用来自 fastAPI 的“background_task”(基本上是来自 Starlette 的“background_task”)。
运行应用程序时,经过一段时间的正常行为后,服务器由于某种原因关闭。
应用程序的日志如下所示:
INFO: Started server process [922]
INFO: Waiting for application startup.
DEBUG: None - ASGI [1] Started
DEBUG: None - ASGI [1] Sent {'type': 'lifespan.startup'}
DEBUG: None - ASGI [1] Received {'type': 'lifespan.startup.complete'}
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
DEBUG: ('10.0.2.111', 57396) - Connected
DEBUG: ('10.0.2.111', 57397) - Connected
DEBUG: ('10.0.2.111', 57396) - ASGI [2] Started
DEBUG: ('10.0.2.111', 57396) - ASGI [2] Received {'type': 'http.response.start', …Run Code Online (Sandbox Code Playgroud) 我有一个 Django 项目在我的本地机器上运行,带有开发服务器manage.py runserver,我试图在将它部署到虚拟机之前用 Uvicorn 运行它。因此,在我的虚拟环境中,我安装uvicorn并启动了服务器,但如下所示,它无法找到 Django 静态 css 文件。
(envdev) user@lenovo:~/python/myproject$ uvicorn myproject.asgi:application --port 8001
Started server process [17426]
Waiting for application startup.
ASGI 'lifespan' protocol appears unsupported.
Application startup complete.
Uvicorn running on http://127.0.0.1:8001 (Press CTRL+C to quit)
INFO: 127.0.0.1:45720 - "GET /admin/ HTTP/1.1" 200 OK
Not Found: /static/admin/css/base.css
Not Found: /static/admin/css/base.css
INFO: 127.0.0.1:45720 - "GET /static/admin/css/base.css HTTP/1.1" 404 Not Found
Not Found: /static/admin/css/dashboard.css
Not Found: /static/admin/css/dashboard.css
INFO: 127.0.0.1:45724 - "GET /static/admin/css/dashboard.css HTTP/1.1" 404 …Run Code Online (Sandbox Code Playgroud) 我有一个由诗歌构建的 fastapi 项目。我想在 pyproject.tom 中使用脚本部分运行应用程序,如下所示:
poetry run start
Run Code Online (Sandbox Code Playgroud)
该部分中的双引号内是什么?
[tool.poetry.scripts]
start = ""
Run Code Online (Sandbox Code Playgroud)
我尝试运行以下脚本。
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
def main():
print("Hello World")
uvicorn.run(app, host="0.0.0.0", port=8000, reload=True, workers=2)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
它停止应用程序并只显示这样的警告。
警告:您必须将应用程序作为导入字符串传递以启用“重新加载”或“工人”。