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