[PEAK] Trellis on_commit and Performers
Phillip J. Eby
pje at telecommunity.com
Fri Oct 3 10:01:39 EDT 2008
At 09:27 AM 10/3/2008 +0300, Sergey Schetinin wrote:
>Performers don't seem to notice changes that are made in on_commit
>callbacks. In this sample the use of on_commit doesn't make sense, but
>generally it can be useful. Anyway if this is by design, it would be
>great if cases like this were detected and raised an exception.
It's not exactly "by design", but this line in the README should be a clue:
"""* It's a bad idea to use ``on_commit()`` for user-level operations"""
;-)
The ``on_commit`` function is part of the low-level STM
infrastructure that the Trellis cell system runs on top of. You
therefore can't expect any sort of inter-cell consistency within
callbacks, as they are used to do cleanup of individual cells in ways
that don't interact with each other. So, don't use on_commit unless
that's the sort of thing you're doing.
>from peak.events.trellis import *
>
>class Watch(Component):
> list = attr()
> @perform
> def watch_count(self):
> print len(self.list)
>
>
>l = List()
>lw = Watch(list=l)
>atomically(on_commit, l.append, 1)
>
>
>This prints just []
>
>
>I also wonder if I'm trying to make Trellis do something it can't.
>What I'm trying to do is to collect all the data required for certain
>operation with side-effects and perform it in on_commit. That
>operation also changes some Trellis cells which then should trigger a
>set of performers that would modify the newly created
>(non-trellis-managed) object.
>
>To work around this, I changed the code to schedule the call by other
>means than on_commit, so the second round of changes happens in a new
>transaction, but I wonder what's the intended way to accomplish this?
Why can't you just use a maintenance rule that depends on the
accumulated data, and let the trellis arrange things in the right
order? I don't see why you need two transactions here.
More information about the PEAK
mailing list