You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@allura.apache.org by Dave Brondsema <da...@brondsema.net> on 2019/07/03 20:14:25 UTC

[allura:tickets] #8314 @memoize on methods should still allow garbage collection



---

** [tickets:#8314] @memoize on methods should still allow garbage collection**

**Status:** in-progress
**Milestone:** unreleased
**Created:** Wed Jul 03, 2019 08:14 PM UTC by Dave Brondsema
**Last Updated:** Wed Jul 03, 2019 08:14 PM UTC
**Owner:** Dave Brondsema


Our `@memoize` works pretty similarly to `@lru_cache` and doesn't do what you might expect on a method (as opposed to a simple function).  It creates a global class-level cache with `self` as one of the args and thus the `self` object is referenced forever and cannot be garbage collected.  https://bugs.python.org/issue19859 describes the situation


---

Sent from forge-allura.apache.org because dev@allura.apache.org is subscribed to https://forge-allura.apache.org/p/allura/tickets/

To unsubscribe from further messages, a project admin can change settings at https://forge-allura.apache.org/p/allura/admin/tickets/options.  Or, if this is a mailing list, you can unsubscribe from the mailing list.

[allura:tickets] #8314 @memoize on methods should still allow garbage collection

Posted by Kenton Taylor <kt...@slashdotmedia.com>.
- **status**: review --> closed



---

** [tickets:#8314] @memoize on methods should still allow garbage collection**

**Status:** closed
**Milestone:** unreleased
**Created:** Wed Jul 03, 2019 08:14 PM UTC by Dave Brondsema
**Last Updated:** Wed Jul 03, 2019 09:32 PM UTC
**Owner:** Dave Brondsema


Our `@memoize` works pretty similarly to `@lru_cache` and doesn't do what you might expect on a method (as opposed to a simple function).  It creates a global class-level cache with `self` as one of the args and thus the `self` object is referenced forever and cannot be garbage collected.  https://bugs.python.org/issue19859 describes the situation


---

Sent from forge-allura.apache.org because dev@allura.apache.org is subscribed to https://forge-allura.apache.org/p/allura/tickets/

To unsubscribe from further messages, a project admin can change settings at https://forge-allura.apache.org/p/allura/admin/tickets/options.  Or, if this is a mailing list, you can unsubscribe from the mailing list.

[allura:tickets] #8314 @memoize on methods should still allow garbage collection

Posted by Dave Brondsema <da...@brondsema.net>.
- **status**: in-progress --> review
- **Comment**:

db/8314 (branched off of [#8311] since it adds a requirement)

I looked into many off-the-shelf existing libraries but none worked:

* `@methodtools.lru_cache()` is supposed to be exactly for this case of a method, but in my testing holds global cache still.  Also has 3 more dependencies it pulls in.
* `@cachedtools.cached(cache={})` holds global cache
* `@cachedtools.cached(cache=WeakValueDictionary())` errors
* `@cachedtools.cachedmethod(lambda self: self.cache, key=partial(hashkey, 'our_method_name'))` requires a self.cache (or creating one on the fly) and knowing the method name to make a properly scoped key
* `@pylru.lrudecorator()` requires size param, holds global cache
* `@ring.lru()` ran into UnicodeEncodeError
* `@memoized_method` from https://stackoverflow.com/a/33672499/ gets interference with Ming since it rewrites the attr

Drop-ins for py3 `functools.lru_cache` (which wouldn't work either):

* `@cachedtools.lru_cache()` errors
* `@repoze.lru.lru_cache()` requires size param, holds global cache
* `@functools32.lru_cache()` holds global cache
* `@backports.functools_lru_cache` holds global cache



---

** [tickets:#8314] @memoize on methods should still allow garbage collection**

**Status:** review
**Milestone:** unreleased
**Created:** Wed Jul 03, 2019 08:14 PM UTC by Dave Brondsema
**Last Updated:** Wed Jul 03, 2019 08:14 PM UTC
**Owner:** Dave Brondsema


Our `@memoize` works pretty similarly to `@lru_cache` and doesn't do what you might expect on a method (as opposed to a simple function).  It creates a global class-level cache with `self` as one of the args and thus the `self` object is referenced forever and cannot be garbage collected.  https://bugs.python.org/issue19859 describes the situation


---

Sent from forge-allura.apache.org because dev@allura.apache.org is subscribed to https://forge-allura.apache.org/p/allura/tickets/

To unsubscribe from further messages, a project admin can change settings at https://forge-allura.apache.org/p/allura/admin/tickets/options.  Or, if this is a mailing list, you can unsubscribe from the mailing list.