threading.local() и contextvars оба предоставляют изолированное хранилище состояния, но работают на разных уровнях параллелизма.
threading.local()asyncio несколько корутин работают в одном потоке, поэтому все корутины разделяют одни и те же значения threading.local()contextvarscontextvars предоставляет хранилище для каждого контекстаasyncio автоматически выполняется в своей скопированной копии контекстаimport asyncio
from contextvars import ContextVar
request_id = ContextVar('request_id')
async def handle_request(rid):
request_id.set(rid)
await asyncio.sleep(0) # приостановка корутины
print(request_id.get()) # всё ещё выводит правильный rid
asyncio.run(asyncio.gather(
handle_request("A"),
handle_request("B")
))
# Output: A, B (изолировано, не перемешано)
threading.local() только для многопоточного параллелизмаContextVar для асинхронного кода или везде, где требуется изоляция контекста между корутинамиasyncio.Task автоматически копирует текущий контекст, гарантируя, что каждая задача имеет своё изолированное состояниеВ приложениях asyncio модуль threading.local() обеспечивает правильную изоляцию между конкурирующими задачами, потому что каждая задача выполняется в собственной изолированной среде потока.
Новый — ещё не проверен сообществом
Вы