"RuntimeError: dictionary changed ... & Ruby

robert no-spam at no-spam-no-spam.com
Sat Mar 11 17:44:30 EST 2006


Alex Martelli wrote:

> robert <no-spam at no-spam-no-spam.com> wrote:
>    ...
> 
>>99.99% no. I would have to use a lock everywhere, where I add or remove
>>something into a dict or list of the struct. Thats not the purpose of
>>big thread locks. Such simple operations are already atomic by the 
>>definition of Python - and thanks to the global interpreter lock. 
>>(Otherwise I would leave the Python language, God beware ... :-) )
> 
> You have misread the Python Language Reference -- if you can give the
> URL on which you have read any such promise of atomicity, I will be glad
> to fix the docs to make that unambiguous.
> 
> There is no such promise (there may be implementation accidents in some
> specific implementation which happen to make some operation atomic, but
> NO guarantee even there that the next bugfix won't break that).

What? When I add/del an item to a dict or list, this is not an atomic 
thread-safe operation?
E.g.:
One thread does things like  d['x']='y'
Another thread reads d['z'] or sets  d['z']='w' or dels something.

If those operations are not atomic, then you'd have to use locks all the 
time to not get RuntimeErrors and worse !?

Infact I rely on that all the time and standard python modules also do 
so AFAIK

The only problem I know, is that on iteration over dicts/lists you get 
this type of error and this is understandable. But usually one solves 
this situations with .keys().

I think cPickle has not necessarily to iterate free over native dicts. 
Whats does copy/deepcopy/[:] ?

> Farwell and best of luck in finding other languages which support
> threads in a way that is more to your liking than Python -- maybe Ruby
> suits you, I don't know for sure though.

I looked several times on Ruby, but stay with Python. Ruby is featured, 
but ill designed.

* Ruby code is very very ugly @!{}&%$||endendend ..... egyptology. 
Nearly back to Perl.

* try to translate this into Ruby:

def f(): return 1
def g(x): return x()
g(f)

=> Then you'll receive a doctor hat about the OO paradigm and the famous 
"Ruby way". But you'll know, why functional programming is a stronger 
religion. Translating OO to Python, you'll often not even notice that 
Python's OO is attached to funcs and dicts. OO is naturally attached! 
The Ruby paradigm is more stilted.

* Ruby doesn't lead to disciplined code. So much names for loops and 
everything => you are thinking and choosing 2x time and receive double 
mud. With Python you write happy and choiceless - but have all and more 
power.

* Ruby without refcounts provides no deterministic __del__ in 
non-circular refs ==> your type  finally finally finally .close .close 
.close all the time

* Rubys module and class namespaces are rewriteable from everywhere 
without any barriers. Thats mostly negative for serious apps. 'require' 
is the same random as C's #include. You scribble and change here - a 
bomb explodes in another module. That kills big projects. Modularization 
and consistency of modular code is 3x better in Python with its local 
module objects and other shielding stuff.

* Ruby threads are not real OS threads, but the Ruby interpreter itself 
switches AFAIK.  a Pro or Con regarding the requirements. The Python 
method is more powerfull for bigger apps

* Ruby so far has no real (simple) generators, but in fact only block 
callbacks (bad readable also). In Ruby there is no framework for delayed 
execution - only a rudimentary error-prone 'callcc'. Thus they 
don't/can't have real iterators. So they also don't know of these kind 
of problems :-). Python is more powerful in that, but things like 
cPickle.dump and deepcopy should be writen with discipline to not break 
code unnecessarily when Python evolves.

* Ruby code executes 2x..4x slower, (but startup of very small scripts 
is 30% faster;)

* etc etc ...

Robert





More information about the Python-list mailing list