Thanks Tres, I've ended up with a threadHelper.py module that seems to
be working well, I'll post it as its small and might be useful for
people googling in the future.

"""Helper utilities for working with threads."""

from ZODB.interfaces import IDatabase
from zope.app import zapi
from zope.app.traversing.api import traverseName
from zope.app.component.hooks import setSite
from zope.app.component.interfaces import ISite
from transaction import manager

def setupWorkerThread(path):
   """sets up the regular contexts for your worker thread, takes a path which
   can be found with zope.app.traversing.api.getPath(obj), the site context of
   your thread will be configured based on this path and the object at the
   path returned."""

   db = zapi.getUtility(IDatabase) #XXX assumes we have only one db
   conn = db.open()
   root = conn.root()

   manager.begin()
   ctx = root['Application']
   for seg in path.split('/')[1:]:
       ctx = traverseName(ctx, seg.encode("ASCII"))
       if ISite.providedBy(ctx):
           setSite(ISite(ctx))
   return ctx


def closeWorkerThread():
   manager.commit()



On 7/3/07, Jim Fulton <[EMAIL PROTECTED]> wrote:
What Tres said. :)

Jim

On Jun 29, 2007, at 8:54 AM, Tres Seaver wrote:

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Tim Stebbing wrote:
>> G'day,
>>
>> I've recently ran into a bit of a problem attempting to use
>> threads in
>> zope 3.2.1, hooks.getSite() returns None, and any attempt to get a
>> utility results in a component lookup error within my threads.
>>
>> I've attempted to pass a site into a thread and set it with
>> hooks.setSite() but this is apparently not the way to go, I get the
>> feeling that a thread that needs access to things form the database
>> probably needs its own connection, context etc.
>
> Your worker thread almost certainly needs its own database
> connection(s):  applicaiton code typically relies on the isolation
> provided by connection-per-thread, which means that it is not
> "safe" in
> general to share persistent objects between threads.
>
> Assuming that you do grab a connection and get its root object, you
> should then be able to traverse to your friendly local site manager,
> calling 'setSite' at *each* parent site manager you pass along the
> way.
>
>> I'm aware of ITask's but unsure if developers are supposed to use
>> them
>> for their own purposes? Do these handle setting up of contexts like
>> db, site, global utils etc? I've googled around a fair bit and been
>> over all the z3 doco, it would be great if there was a simple
>> howto on
>> setting up a thread that would have the usual access to various
>> components.
>
>
> Tres.
> - --
> ===================================================================
> Tres Seaver          +1 540-429-0999          [EMAIL PROTECTED]
> Palladion Software   "Excellence by Design"    http://palladion.com
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.6 (GNU/Linux)
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
>
> iD8DBQFGhQEG+gerLs4ltQ4RAh6EAJ9DzBW20NPz4tAE3BydJ789Vokx0wCg2qMp
> yBB8XemrjD7dXPwwwz4y9Yo=
> =+iwh
> -----END PGP SIGNATURE-----
> _______________________________________________
> Zope3-dev mailing list
> Zope3-dev@zope.org
> Unsub: http://mail.zope.org/mailman/options/zope3-dev/jim%40zope.com
>

--
Jim Fulton                      mailto:[EMAIL PROTECTED]             Python 
Powered!
CTO                             (540) 361-1714                  
http://www.python.org
Zope Corporation        http://www.zope.com             http://www.zope.org






--
Timothy J Stebbing
_______________________________________________
Zope3-dev mailing list
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to