[PEAK] issues with Trellis event loops and threads
Phillip J. Eby
pje at telecommunity.com
Tue Jul 22 13:38:21 EDT 2008
At 07:27 PM 7/22/2008 +0300, Sergey Schetinin wrote:
>So this seems to work. Any hints about what to look out for?
Make sure that your thread *never* accesses any methods of shared
services except inside trellis rules, or if it explicitly holds your
global lock. Those methods (such as Time.reached(), which is called
by bool(aTimer)) may access private attributes that are not cells and
thus not protected by your global lock.
>Also, I think I found a bug with the basic EventLoop implementation --
>the main loop never exits if there were any events scheduled,
That is correct and intended behavior. You are meant to explicitly
terminate event loops; it's an extra feature of the basic EventLoop
that it automatically exits when nothing is queued or scheduled.
> > Bear in mind, however, that doing this is an incredibly, horrifically bad
> > idea and you should never actually do it, because most services aren't
> > going to be sharable across threads. Really, you should explicitly share
> > those services that need to be -- and CAN be -- shared across threads.
>
>Well, the reason to use Contextual for me (apart from Trellis) is that
>because the code that performs some actions doesn't know about all the
>context that is required for the underlying operations (as there are
>multiple backends), with Contextual it's possible, in a way, to pass
>the parameters to code that will only be called some levels deeper
>into the stack, and sometimes the call can happen in another thread.
>Is that a misuse of the library or should I be safe as long as I only
>use my own services in this way?
It's not a misuse of the library; but the idea is that most of the
time you'll share service *factories* across threads, not service
*instances*, unless the service is in fact thread-safe.
Contextual is still in fairly early development, though. A later
version will offer a way for service factories to depend on the
thread in which they're run, which will automatically ensure that
instances don't get shared across threads. (Really, this should be
Contextual's default behavior, with a way to override it to specify
that a service is supposed to be threadsafe.)
More information about the PEAK
mailing list