[ZODB-Dev] Threads, ZODB,
and how to install ZODB without distutils
Manuel Vazquez Acosta
mva.led at gmail.com
Mon Feb 12 01:05:02 EST 2007
Chris,
Thanks for your response. I will try the locking first and the see if I
can implement a transaction manager of my own.
I will read about virtualizing Python, I'm a debian user :))
Thanks and best regards,
Manuel.
Chris McDonough wrote:
> On Feb 11, 2007, at 7:29 PM, Manuel Vazquez Acosta wrote:
>
>> Hi all,
>>
>> I'm writing a small application for which I want to use ZODB's
>> persistence machinery. I have a couple of question, though.
>>
>> I have read that each thread should have its own connection to the
>> DB. However, in my case, each thread should be aware of what is
>> actually in the DB at all times. So I wonder if I can shared the
>> connection between those threads as long as I take the means to
>> protect it (i.e RLock).
>
> I am not certain, actually. The mechanism for doing this is in
> there. The interfaces.py file states:
>
> Synchronization
> ---------------
>
> A Connection instance is not thread-safe. It is designed to
> support a thread model where each thread has its own transaction.
> If an application has more than one thread that uses the
> connection or the transaction the connection is registered with,
> the application should provide locking.
>
> And it goes on to talk about the sync=False parameter vaguely.
>
> But the story doesnt really end there... there is also the capability
> to register a different "transaction manager" at DB open time.. the
> default one assumes one transaction per thread.
>
> I'd need to dig through all this code to reunderstand it, but it looks
> possible.
>
>>
>> My scenario is akin a consumer-producer with shared buffer. Consumers
>> pull items from the buffer whilst producers put items in the buffer.
>> The buffer is an OOBTree along with an IOBTree which gives "serial"
>> numbers to the keys of the OOBTree.
>
> The typical way to do this using one-connection-per-thread and a
> threaded txn manager would be to call transaction.commit() when
> mutating the shared data structures. To detect changes to the objects
> provided by a connection (due to other threads committing during the
> connection's transaction), you can connection.sync(). Zope calls
> transaction.begin() at the beginning of a request and either
> transaction.abort() (on failure) or transaction.commit() (on success)
> at its termination. It never needs to do an explict connection.sync()
> because it never wants to do a "dirty read" (each request has its own
> connection and sees its connection data as canonical for the duration
> of its existence). Zope handles conflicts by retrying the request.
> But Zope has it easy because the web has natural transaction
> boundaries that don't always exist in GUI apps or other apps with a
> different request/response cycle.
>
>>
>> The other question is about compiling ZODB without using the
>> out-of-the-box distutils installation procedure. I'm also playing
>> with Zope and Plone, so I have several instances on the same machine.
>> I think installing with distutils may cause conflicts with the Zope
>> instances. Am I right? If so, then how should I install ZODB
>> side-by-side the consumer-producer application?
>
> The easiest thing to do here is to install a separate Python instance
> for each project. Alternately if you're on UNIX, you can use "virtual
> python" (http://peak.telecommunity.com/dist/virtual-python.py) which
> makes a tree of symlinks that acts like a new Python instance but has
> its own "site packages" directory in which distutils stuff is installed.
>
> If you're on Windows, I believe Zope/Plone ship with their own copy of
> Python on that platform, so installing to the system python shouldnt
> create a conflict.
>
> - C
>
>
More information about the ZODB-Dev
mailing list