Merge d4d1959a69 into b5addb64f0
This commit is contained in:
commit
b88d34ad18
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user