На уровне ОС потоки - это единицы выполнения, которые совместно используют одни и те же ресурсы (память, файловые дескрипторы и т. Д. c). Группы потоков, которые принадлежат разным процессам, изолированы друг от друга, не могут получить доступ к ресурсам через границу процесса. Вы можете думать о «справедливом процессе» как о едином потоке, не похожем ни на один другой поток.
Потоки ОС планируются так, как вы ожидаете: если есть несколько ядер, они могут работать параллельно; если потоков / процессов, готовых к запуску, больше, чем ядер, некоторые потоки через некоторое время прерываются, приостанавливаются, и другой поток может работать на этом ядре.
В Python , однако разница между потоками (threading
модуль) и процессами (multiproceessing
модуль) составляет drasti c.
Python работает в виртуальной машине. Потоки работают внутри этой виртуальной машины. Объекты в ВМ подсчитываются по ссылкам, а также небезопасны для одновременного изменения. Таким образом, планирование потоков ОС, которое может выгрузить один поток в середине инструкции VM, модифицирующей объект, и передать управление другому объекту, который обращается к тому же объекту, приведет к повреждению.
Вот почему глобальная блокировка интерпретатора ака GIL существует. Это в основном предотвращает любой вычислительный параллелизм между Python «потоками»: одновременно может работать только один поток, независимо от того, сколько у вас процессорных ядер. Потоки Python хороши только для ожидания ввода-вывода.
В отличие от этого, multiprocessing
запускает параллельную виртуальную машину (интерпретатор Python) и делится с ней выбранными частями данных безопасным способом (путем копирование или использование общей памяти). Такие параллельные процессы могут работать параллельно и использовать несколько ядер ЦП.
Вкратце: Python потоки threads потоки ОС.