Daniel Kluev <dan.kl...@gmail.com> wrote: > test.py: > > from threading import Thread > class X(object): > pass > obj = X() > obj.x = 0 > > def f(*args): > for i in range(10000): > obj.x += 1 > > threads = [] > for i in range(100): > t = Thread(target=f) > threads.append(t) > t.start() > > for t in threads: > while t.isAlive(): > t.join(1) > > print(obj.x) > >> python test.py > 1000000 >> pypy test.py > 1000000 >> jython-2.5 test.py > 19217 >> ipy test.py > 59040 > > Not that this thing is reasonable to do in real code, but cpython and > other implementations with GIL at least give you some safety margin. > Sure? ;) > for p in python2.4 python2.5 python2.6 python2.7 python3.1 python3.2; do > echo $p; $p /tmp/test.py; $p /tmp/test.py; done python2.4 525369 736202 python2.5 449496 551023 python2.6 903405 937335 python2.7 885834 910144 python3.1 866557 766842 python3.2 1000000 1000000
So even CPython (at least < 3.2) isn't safe. And I wouldn't rely on 3.2 not to break. Marc -- http://mail.python.org/mailman/listinfo/python-list