[ZODB-Dev] ZEO client with Asyncore loop
Jim Fulton
jim at zope.com
Thu Dec 7 13:28:07 EST 2006
Note that ZODB 3.7 already provides a separate dedicated client
asyncore loop. You might try using that. There is a beta release at:
http://download.zope.org/distribution/ZODB3-3.7.0b3.tar.gz
Note that this release should work well with easy_install or
zc.buildout. It doesn't include ZConfig, zdaemon, zope.interface,
zope.proxy, or zope.testing, as these are now handled as dependencies.
Also note that while the release is still beta, because I haven't had
time to make a final release, this release is being used in current
versions of Zope.
Jim
On Dec 7, 2006, at 12:44 PM, Matthew Pontefract wrote:
> Hello
>
> I'm writing client code that uses ZODB over a ZEO connection. In
> order not to have to call connection.sync() to synchronise the
> cache with the server I wish to provide the ZEO client with an
> asyncore mainloop to which it can attach itself. No matter how I do
> this, however, my clients
> do not seem to be processing cache invalidation/update messages
> asynchronously.
>
> My client code does not make use of asyncore itself so the thread
> is started especially for ZEO's use. I've tried starting the loop
> thread *after* getting the ZEO connection:
>
> ==============================
> class AsyncoreRunner(threading.Thread):
> def __init__(self,env):
> threading.Thread.__init__(self)
> self.env=env
> self.setDaemon(True)
>
> def run(self):
> self.env.sys.logger.info("Asyncore loop starting")
> try:
> asyncore.loop()
> except Exception,ex:
> self.env.sys.logger.error("Asyncore loop quitting: %s"%
> str(ex))
> self.env.sys.logger.info("Asycore loop ended")
>
>
>
> addr = host, port
> storage=ClientStorage.ClientStorage(addr)
> db = DB(self.storage)
> conn = self.db.open()
> mt = AsyncoreRunner(self.env)
> mt.start()
> ==============================
>
> ... and I've tried starting it BEFORE getting the connection
> (providing a dummy dispatcher so that the asyncore.loop() does not
> return immediately).
>
> In either case, if I run two clients the following does not work
> where I would imagine it should if the messages were being
> processed on the asyncore thread.
>
> CLIENT 1:
> root = conn.root()
> root['test']=10
> transaction.commit()
>
> CLIENT 2:
> root['test']
> ... KeyError...
> conn.sync()
> root['test']
> 10
> root['test'] = 20
> transaction.commit()
>
> CLIENT1:
> root['test']
> 10 <----- Not 20!
> conn.sync()
> root['test']
> 20 <----- now it is!
>
>
> Have I misunderstood things very badly? Am I approaching things too
> simplistically?
>
> I have googled and searched a lot of documentation but I just can't
> find the key to my problem! Here's hoping that someone on this list
> can help!
>
> Many thanks in advance,
> Matthew
>
> _______________________________________________
> For more information about ZODB, see the ZODB Wiki:
> http://www.zope.org/Wikis/ZODB/
>
> ZODB-Dev mailing list - ZODB-Dev at zope.org
> http://mail.zope.org/mailman/listinfo/zodb-dev
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the ZODB-Dev
mailing list