GIL in alternative implementations
Marc Christiansen
usenet at solar-empire.de
Sat May 28 05:55:34 EDT 2011
Daniel Kluev <dan.kluev at 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
More information about the Python-list
mailing list