3

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

twds
  • 333
  • 1
  • 4
  • 15

2 Answers2

1

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!

whoosis
  • 454
  • 7
  • 25
0

In all likelyhood, the extra 60% CPU usage you're seeing is simply your various threads fighting over the GIL.

There is, after all, some time spent outside the GIL where the interpreter is working to release/acquire the GIL and the O/S scheduler being at work to arbitrate them.

Dolda2000
  • 25,216
  • 4
  • 51
  • 92