Почему очень маленький контрольный интервал не замедляет многопоточность с интенсивным использованием процессора в python3? - PullRequest
0 голосов
/ 23 мая 2018
from threading import Thread

def countdown(start, end):
    while end > start:
        end -= 1

def multi_thread(n):
    t1 = Thread(target=countdown, args=(0, n // 2))
    t2 = Thread(target=countdown, args=(n // 2, n))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

if __name__ == '__main__':
    import timeit
    import sys

    sys.setswitchinterval(1)
    print(timeit.timeit("""import gil;gil.multi_thread(10000000);""", number=1))
    # 1.07s
    sys.setswitchinterval(0.001)
    print(timeit.timeit("""import gil;gil.multi_thread(10000000);""", number=1))
    # 1.09s

После прочтения NewGIL.pdf я думаю, что небольшой интервал приведет к большему количеству операций сна / пробуждения потока, и тогда общее время выполнения должно быть больше.Я не прав?

Тестовая среда: четырехъядерный Ubuntu16.04 python3.5.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Обратите внимание, что ваша общая задача занимает всего около 1 секунды.Таким образом, с интервалом переключения 0,001 секунды будет только около 1 / 0,001 = тысяча переключений всего .Стоимость каждого коммутатора (которая происходит «на скорости C») более естественно измеряется в микросекундах, чем в миллисекундах, поэтому тысячи из них остаются дешевыми по сравнению с общим временем в 1 секунду.

Чтобы увидеть большеВ качестве эффекта попробуйте установить интервал переключения на 1e-6.

В реальной жизни реальная стоимость переключения потоков чаще всего связана с связанными затратами: поток получает достаточно времени для заполнения HWзатем кеш команд и данных отключается, и новый поток сначала испытывает потери кеша на разных уровнях.В вашем примере таких затрат нет (код и данные, используемые каждым потоком, относительно крошечные, а содержимое обоих потоков помещается даже в кэш L1 одновременно).

0 голосов
/ 23 мая 2018

Да, вы правы.Более низкий интервал переключения означает, что будут более частые условные опросы против GIL, чтобы увидеть, можно ли его получить.И поскольку мы не можем запускать потоки параллельно из-за GIL, более частое переключение контекста фактически снижает нашу производительность.

Если вы хотите повысить производительность своей системы, вам придется использовать мультипроцессорное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...