Многие ссылки говорят, что Python GIL снижает производительность многопоточного кода на многоядерной машине, поскольку каждый поток должен будет получить GIL перед выполнением.
Другими словами, похоже, что GIL фактически переводит многопоточную программу Python в однопоточный режим.
Например:
(1) Поток A получить GIL, выполнить некоторое время, отпустить GIL
(2) Поток B получает GIL, выполняет некоторое время, отпускает GIL
...
Однако после некоторых простых экспериментов я обнаружил, что, хотя GIL снижает производительность, общая загрузка ЦП может превышать 100% на многоядерной машине.
from threading import Thread
def test():
while 1:
pass
for i in range(4):
t = Thread(target=test)
t.start()
На 4-ядерной 8-поточной машине указанная выше программа будет занимать около 160% использования ЦП. Я что-то неправильно понял? Два потока могут выполняться точно в один и тот же момент? Или в расчете использования ЦП есть ошибка, или что-то не так?
Спасибо
top
в оболочке, отобразится%CPU
. - person twds   schedule 30.01.2016