Каждый поток выполняет свой собственный цикл интерпретатора? (CPython) - PullRequest
0 голосов
/ 07 ноября 2019

Когда мы запускаем одно потоковое приложение, это выглядит просто. Интерпретатор CPython запускает одну за другой инструкцию байт-кода и выполняет ее немедленно. Но если мы запускаем другой поток из первого, есть ли у него собственный цикл, использующий байт-код, и они совместно используют некоторую общую память для синхронизации (GIL и т. Д.) Или каким-то образом цикл из инструкций делегирования первого (основного) потока для второго? Я не могу понять, как второй поток получает инструкции о том, что он должен выполнить, если его нужно постоянно интерпретировать. Я понимаю, что он не будет работать параллельно из-за GIL, но вопрос о интерпретации инструкций, происходит ли это в обоих потоках?

import threading

def thread_function(value):
    print(value)

if __name__ == "__main__":

    x = threading.Thread(target=thread_function, args=(1,))
    x.start()

, в каком потоке print(value) будет интерпретироваться (основной или дочерний)

1 Ответ

1 голос
/ 11 ноября 2019

Я думаю, что чтение кода CPython будет полезно.

Все необходимые сведения вы найдете в ceval.c

Я также довольно плохо знаком с CPython. Я попытаюсь поделиться своим пониманием.

  1. основной цикл (запустить навсегда или цикл интерпретации Python начинается в строке 1184, для (;;)
  2. вы можете попробовать dis module и понять, какPython-код преобразуется в байт-код
  3. интерпретатор будет принимать байт-код и выполнять один за другим
  4. как переключается поток? строка 1233-1250, переключается поток

Вы можетепредставьте себе, что как только вы вызовете threading.Thread, байт-код для создания объекта потока и его целевой функции будет добавлен в текущий список инструкций.

Когда интерпретатор обрабатывает этот байт-код, он заметит, что создается новый поток (этошаг, я не совсем уверен. Вы можете проверить ceval.py и модуль потоков для проверки).

Теперь у вас есть два списка байт-кода для использования интерпретатором Python.

Это будет по очереди в соответствиик своим собственным правилам (то есть для каждого потока на 100 инструкций, а затем решить, переключаться ли, обрабатывать специальные сигналы или другие)

Надеюсь, что ответтвои сомнения.

Глубокое понимание и ничего не принимать как должное - это здорово!

Надеюсь, вы хорошо проведете время, изучая cpython.

...