This commit is contained in:
Neil Schemenauer 2026-02-23 17:33:45 +04:00 committed by GitHub
commit b88d34ad18
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 4 deletions

View File

@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [UNRELEASED]
### Fixed
* Avoid creating references cycles from `BoundSyncStream` and `BoundAsyncStream` to the response object. This allows memory to be freed by reference counting, which happens quickly, rather than waiting for the cyclic GC to run.
### Removed
* Drop support for Python 3.8

View File

@ -6,6 +6,7 @@ import logging
import time
import typing
import warnings
import weakref
from contextlib import asynccontextmanager, contextmanager
from types import TracebackType
@ -146,7 +147,7 @@ class BoundSyncStream(SyncByteStream):
self, stream: SyncByteStream, response: Response, start: float
) -> None:
self._stream = stream
self._response = response
self._response = weakref.ref(response)
self._start = start
def __iter__(self) -> typing.Iterator[bytes]:
@ -155,7 +156,9 @@ class BoundSyncStream(SyncByteStream):
def close(self) -> None:
elapsed = time.perf_counter() - self._start
self._response.elapsed = datetime.timedelta(seconds=elapsed)
response = self._response()
if response is not None:
response.elapsed = datetime.timedelta(seconds=elapsed)
self._stream.close()
@ -169,7 +172,7 @@ class BoundAsyncStream(AsyncByteStream):
self, stream: AsyncByteStream, response: Response, start: float
) -> None:
self._stream = stream
self._response = response
self._response = weakref.ref(response)
self._start = start
async def __aiter__(self) -> typing.AsyncIterator[bytes]:
@ -178,7 +181,9 @@ class BoundAsyncStream(AsyncByteStream):
async def aclose(self) -> None:
elapsed = time.perf_counter() - self._start
self._response.elapsed = datetime.timedelta(seconds=elapsed)
response = self._response()
if response is not None:
response.elapsed = datetime.timedelta(seconds=elapsed)
await self._stream.aclose()