Я выполняю программу Python, которая создает 5 потоков следующим образом:
Код: Выделить всё
import time
from threading import Thread
def do_work(thread_number):
print(f"Starting thread {thread_number}")
time.sleep(1)
print(f"Ending thread {thread_number}")
for i in range(5):
t = Thread(target=do_work, args=(i,))
t.start()
Выход 1:
Код: Выделить всё
Starting thread 0
Starting thread 1
Starting thread 2
Starting thread 3
Starting thread 4
Ending thread 1
Ending thread 0
Ending thread 4
Ending thread 3
Ending thread 2
Код: Выделить всё
Starting thread 0
Starting thread 1
Starting thread 2
Starting thread 3
Starting thread 4
Ending thread 4
Ending thread 2
Ending thread 3
Ending thread 0
Ending thread 1
Код: Выделить всё
Starting thread 0
Starting thread 1
Starting thread 2
Starting thread 3
Starting thread 4
Ending thread 4
Ending thread 1
Ending thread 3
Ending thread 2
Ending thread 0
Из выходных данных ясно, что GIL возвращает прерванный поток последним в очереди ожидания.
И это причина, по которой начатый поток печатается первым каждый раз перед любым конечным потоком .
Но поскольку потоки выполняются по порядку, т. е. сначала 0-й, затем 1-й, затем 2-й,.... затем 4-й, и если они возвращаются в конец очереди готовности, почему они не заканчиваются в том же порядке?
Какие факторы меняют этот порядок?
Подробнее здесь: https://stackoverflow.com/questions/792 ... to-the-rea