cPython, IronPython, Jython, and PyPy (Oh my!)
Ethan Furman
ethan at stoneleaf.us
Wed May 16 19:01:33 EDT 2012
Tim Delaney wrote:
> On 17 May 2012 07:33, Ethan Furman wrote:
>> Just hit a snag:
>>
>> In cPython the deterministic garbage collection allows me a
>> particular optimization when retrieving records from a dbf file --
>> namely, by using weakrefs I can tell if the record is still in
>> memory and active, and if so not hit the disk to get the data; with
>> PyPy (and probably the others) this doesn't work because the record
>> may still be around even when it is no longer active because it
>> hasn't been garbage collected yet.
>
>
> What is the distinguishing feature of an "active" record? What is the
> problem if you get back a reference to an inactive record? And if there
> is indeed a problem, don't you already have a race condition on CPython?
>
> 1. Record is active;
> 2. Get reference to record through weak ref;
> 3. Record becomes inactive;
> 4. Start trying to use the (now inactive) record.
A record is an interesting critter -- it is given life either from the
user or from the disk-bound data; its fields can then change, but those
changes are not reflected on disk until .write_record() is called; I do
this because I am frequently moving data from one table to another,
making changes to the old record contents before creating the new record
with the changes -- since I do not call .write_record() on the old
record those changes do not get backed up to disk.
With CPython as soon as a record goes out of scope it dies, and the next
time I try to access that record I will get the disk version, without
the temporary changes I had made earlier (this is good). However, with
PyPy (and others) not all records are destroyed before I try to access
them again, and I end up seeing the temp data instead of the disk data.
~Ethan~
More information about the Python-list
mailing list