David Beazley <d...@dabeaz.com> added the comment: As a followup, since I'm not sure anyone actually here actually tried a fair GIL on Linux, I incorporated your suggested fairness patch to the condition-variable version of the GIL (using this pseudocode you wrote as a guide):
with gil.cond: if gil.n_waiting or gil.locked: gil.n_waiting += 1 while True: gil.cond.wait() #always wait at least once if not gil.locked: break gil.n_waiting -= 1 gil.locked = True I did some tests on this and it does appear to exhibit fairness. Here are the results of running the 'fair.py' test with a fair GIL on my Linux system: [ Fair GIL Linux ] Sequential execution slow: 6.246764 (0 left) fast: 0.465102 (0 left) Threaded execution slow: 7.534725 (0 left) fast: 7.674448 (0 left) Treaded, balanced execution: fast A: 10.415756 (0 left) fast B: 10.456502 (0 left) fast C: 10.520457 (0 left) Treaded, balanced execution, with quickstop: fast B: 8.423304 (0 left) fast A: 8.409794 (16016 left) fast C: 8.381977 (9162 left) beaz...@ubuntu:~/Desktop/Python-2.6.4$ If I switch back to the unfair GIL, this is the result: [ Unfair GIL, original implementation, Linux] Sequential execution slow: 6.164739 (0 left) fast: 0.422626 (0 left) Threaded execution slow: 6.570084 (0 left) fast: 6.690927 (0 left) Treaded, balanced execution: fast A: 1.994143 (0 left) fast C: 2.014925 (0 left) fast B: 2.073212 (0 left) Treaded, balanced execution, with quickstop: fast A: 1.614533 (0 left) fast C: 1.607324 (377323 left) fast B: 1.625987 (111451 left) Probably the main thing to notice is the huge increase in performance over the fair GIL. For instance, the balance execution test runs about 5 times faster. Here are the two tests repeated with checkinterval = 1000. [ Fair GIL, checkinterval = 1000] Sequential execution slow: 6.175320 (0 left) fast: 0.424410 (0 left) Threaded execution slow: 6.505094 (0 left) fast: 6.746649 (0 left) Treaded, balanced execution: fast A: 2.243123 (0 left) fast B: 2.416043 (0 left) fast C: 2.442475 (0 left) Treaded, balanced execution, with quickstop: fast A: 1.565914 (0 left) fast C: 1.514024 (81254 left) fast B: 1.531937 (63740 left) [ Unfair GIL, checkinterval = 1000] Sequential execution slow: 6.258882 (0 left) fast: 0.411590 (0 left) Threaded execution slow: 6.255027 (0 left) fast: 0.409412 (0 left) Treaded, balanced execution: fast A: 1.291007 (0 left) fast C: 1.135373 (0 left) fast B: 1.437205 (0 left) Treaded, balanced execution, with quickstop: fast C: 1.331775 (0 left) fast A: 1.418670 (54841 left) fast B: 1.403853 (208732 left) Here, the unfair GIL is still quite a bit faster on raw performance. I tried kicking the check interval up to 10000 and the unfair GIL still won by a pretty significant margin on raw speed of completing the different tasks. I've attached a copy of the thread_pthread.h file I modified for this test. It's from Python-2.6.4. ---------- Added file: http://bugs.python.org/file16958/thread_pthread.h _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue8299> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com