MagicStack / MagicStack/uvloop
Allow context for tasks that block the event loop
まだ誰も着手していません。
- 主要言語
- Cython
- スター
- 11.9k
- フォーク
- 616
- PR マージ指標
- 30日以内にマージされた PR はありません
説明
Hi all,
This is probably more of a discussion than an actual issue and I fully appreciate that this could be more of a Python asyncio question versus anything specific to uvloop's implementation (I've also started a discussion there), but I figured I'd ask here first because uvloop is wonderful and you all clearly have a deep understanding of creating an event loop implementation in Python.
My issue is this: when debug mode is enabled for the Python event loop, is it somehow possible to get slow logs to tell us more about the context the task is running in?
The motivation is that in many asyncio server frameworks like FastAPI, it is critical to not block the event loop but using asyncio's debug mode provides output that's not helpful.
Consider the following FastAPI server:
# server.py
# run with PYTHONASYNCIODEBUG=1 uvicorn server:app --reload --port 8000 --host 0.0.0.0
import time
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
time.sleep(2) # intentionally block event loop for 2 seconds
return {"message": "Hello World"}
If you curl http://127.0.0.1:8000/, you'll see something along the lines of:
Executing <Task finished name='Task-4' coro=<RequestResponseCycle.run_asgi() done, defined at /Users/mike.sukmanowsky/code/z/z/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/h11_impl.py:401> result=None created at /Users/mike.sukmanowsky/code/z/z/.venv/lib/python3.13/site-packages/uvicorn/protocols/http/h11_impl.py:250> took 2.006 seconds
This is consistent with what uvloop and other event loop implementations do here.
But from this output I cannot determine:
- What endpoint this occurred on
- The full stack trace of my user-defined code that might point me to the culprit that's blocking the loop
For ASGI frameworks like FastAPI, blocking the event loop effectively means a death for concurrency.
I'm unaware of any way to make outputs more useful here, but I'm very much hoping either 1) I've missed an obvious way to do this or 2) this inspires some discussion that could lead to changes that'll eventually help all Python asyncio users better troubleshoot issues like this.
コントリビューションガイド
このリポジトリのコントリビューションガイドは索引されていません
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず uvloop/cbhandles.pyx の 268-273 行を読み、PYTHONASYNCIODEBUG=1 の下で server.py にある FastAPI の再現を使って、その debug slow-log の動作を asyncio の実装と比較してください。この issue では、受け入れられる出力も実装も定義されていないため、コーディングする前に、望ましいコンテキストとスタックトレースの動作を明確にしてください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- python
- 領域
- backend, observability
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- 説明が足りない
- 初心者へのやさしさ
- 25/100