Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding initial commit for the blocking functionality in the get func… #535

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions pymemcache/pool.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,17 +72,27 @@ def get_and_release(self, destroy_on_fail=False) -> Iterator[T]:
raise
self.release(obj)

def get(self):
def get(self, **options):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not use keyword arguments with defaults here? That and a docstring will make this feature easier to find and documented in our code docs.

# get the current time in seconds and the maximum time we can run the function until
current_time = time.time()
end_time = current_time + max(options.get('timeout', 0), 0)

with self._lock:
# while there are free objects or we are before the time limit
# Find a free object, removing any that have idled for too long.
now = self._idle_clock()
while self._free_objs:
obj = self._free_objs.popleft()
if now - obj._last_used <= self.idle_timeout:
break

if self._after_remove is not None:
self._after_remove(obj)
while current_time <= end_time:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if I understand this correctly this results in busy waiting all while holding a lock. Which seems like a behavior we don't want to introduce.

# get the current time again to check if we can run another iteration
current_time = time.time()
now = self._idle_clock()

while self._free_objs:
obj = self._free_objs.popleft()
if now - obj._last_used <= self.idle_timeout:
break

if self._after_remove is not None:
self._after_remove(obj)

else:
# No free objects, create a new one.
curr_count = len(self._used_objs)
Expand Down