как продемонстрировать Python GIL (откуда я знаю, что одновременно выполняется только один поток) - PullRequest
0 голосов
/ 08 июля 2019

Есть ли способ продемонстрировать, что "только один поток может выполнять код за раз"?

Странное наблюдение состоит в том, что я вижу несколько ядер, работающих в htop, как если бы одновременно выполнялось несколько потоков, что это?

(Причина, по которой я хочу это сделать, заключается в том, что я использую pybind для привязки своего кода cpp к python, и я имею дело с некоторой политикой выпуска GIL, поэтому я хочу посмотреть, сколько потоков выполняется )

1 Ответ

1 голос
/ 08 июля 2019

Попробуйте выполнить сложную задачу, которая использует много ЦП, например, вычислить 15800000-й член последовательности Фибоначчи.Занимает около 2 секунд в одном потоке, используя IDLE.Попробуйте сделать это на двоих сейчас.

import threading
import timeit

def tesr():
    a, b = 1, 0
    for _ in range(15800000):
        a, b = a + b, b

# Current thread
print("Current thread time:")
print(timeit.timeit(
    stmt='tesr()',
    setup='from __main__ import tesr',
    number=1,
))
print()

# Single thread
print("Single thread time:")
print("(Should take about the same time as current)")
t = threading.Thread(target=tesr)
print(timeit.timeit(
    stmt='t.start(); t.join()',
    setup='from __main__ import t',
    number=1,
))
print()

# Two threads
t1, t2 = (threading.Thread(target=tesr) for _ in range(2))
print("Two threads time:")
print("(Should take about double the current / single time)")
print(timeit.timeit(
    stmt='t1.start(); t2.start(); t1.join(); t2.join()',
    setup='from __main__ import t1, t2',
    number=1,
))

Мой вывод:

Current thread time:
2.0613602900000387

Single thread time:
(Should take about the same time as current)
2.228870080999968

Two threads time:
(Should take about double the current / single time)
4.671865998000044
...