Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python GIL prevent CPU usage to exceed 100% in multiple core machine?

Many references say that, Python GIL lower down the performance of multi threading code in multi core machine, since each thread will need to acquire the GIL before executioin.

In other words, it looks like GIL make a multi threading Python program to a single thread mode in fact.

For example:

(1) Thread A get GIL, execute some time, release GIL

(2) Thread B get GIL, execute some time, release GIL

...

However, after some simple experiments, I found that although GIL lower down the performance, the total CPU usage may exceed 100% in multiple core machine.

from threading import Thread

def test():
    while 1:
        pass

for i in range(4):
    t = Thread(target=test)
    t.start()

On a 4 core, 8 thread machine, the above program will occupy around 160% CPU usage. Is there anything I misunderstand? Two threads can execute exactly at the same moment? Or the CPU usage calculation has bias or something wrong?

Thanks

like image 770
twds Avatar asked Aug 31 '26 09:08

twds


1 Answers

In addition to Dolda2000 answer, Python bytecode will only be executed by a single processor at a time because of GIL. Only certain C modules (which don't manage Python state) will be able to run concurrently.

Threading is more appropriate for I/O-bound applications (I/O releases the GIL, allowing for more concurrency) in other cases, python multi-threading is slower and shows degraded performance than serial. So to exploit all cores and for better performance, use multiprocessing. There's a very nice explanation of it in this answer, check it out!

like image 51
whoosis Avatar answered Sep 02 '26 23:09

whoosis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!