Чем потоки отличаются от процессов с точки зрения того, как они выполняются на аппаратном уровне? - PullRequest
0 голосов
/ 04 марта 2020

Мне было интересно, как потоки выполняются на аппаратном уровне, как если бы процесс выполнялся на одном ядре обработки и выполнял переключение контекста на процессоре и MMU для переключения между процессами. Как переключаются потоки? Во-вторых, когда мы создаем / порождаем новый поток, будет ли он рассматриваться как новый процесс для процессора и будет ли он запланирован как процесс?

Кроме того, когда следует использовать потоки и когда новый процесс?

Я знаю, что, возможно, сейчас я звучу глупо, потому что в моих знаниях есть огромные пробелы, которые я хотел бы заполнить. Заранее спасибо, что нашли время и объяснили мне вещи. :)

Ответы [ 3 ]

2 голосов
/ 04 марта 2020

Есть несколько разных методов для параллелизма. Поточный модуль создает потоки в одном и том же процессе Python и переключается между ними, это означает, что они на самом деле не работают одновременно. То же самое происходит с модулем Asyncio, однако это имеет дополнительную функцию настройки, когда поток может быть переключен.

Затем существует многопроцессорный модуль, который создает отдельный Python процесс для каждого потока. Это означает, что потоки не будут иметь доступа к общей памяти, но это может означать, что процессы выполняются на разных ядрах ЦП и, следовательно, могут обеспечить повышение производительности для задач, связанных с ЦП.

Что касается использования новых потоков, хорошее практическое правило будет следующим:

  • Для проблем, связанных с вводом / выводом, используйте многопоточность или асинхронный c ввод / вывод. Это потому, что вы ожидаете ответов от чего-то внешнего, например, от базы данных или браузера, и это время ожидания может быть заполнено другим потоком, выполняющим свою задачу.

  • Для проблем с процессором используйте многопроцессорность. Это может запускать несколько процессов Python на разных ядрах одновременно.

Отказ от ответственности: многопоточность не всегда является решением, и вы должны сначала определить, необходимо ли это, а затем попытаться реализовать решение.

1 голос
/ 04 марта 2020

На уровне ОС потоки - это единицы выполнения, которые совместно используют одни и те же ресурсы (память, файловые дескрипторы и т. Д. c). Группы потоков, которые принадлежат разным процессам, изолированы друг от друга, не могут получить доступ к ресурсам через границу процесса. Вы можете думать о «справедливом процессе» как о едином потоке, не похожем ни на один другой поток.

Потоки ОС планируются так, как вы ожидаете: если есть несколько ядер, они могут работать параллельно; если потоков / процессов, готовых к запуску, больше, чем ядер, некоторые потоки через некоторое время прерываются, приостанавливаются, и другой поток может работать на этом ядре.

В Python , однако разница между потоками (threading модуль) и процессами (multiproceessing модуль) составляет drasti c.

Python работает в виртуальной машине. Потоки работают внутри этой виртуальной машины. Объекты в ВМ подсчитываются по ссылкам, а также небезопасны для одновременного изменения. Таким образом, планирование потоков ОС, которое может выгрузить один поток в середине инструкции VM, модифицирующей объект, и передать управление другому объекту, который обращается к тому же объекту, приведет к повреждению.

Вот почему глобальная блокировка интерпретатора ака GIL существует. Это в основном предотвращает любой вычислительный параллелизм между Python «потоками»: одновременно может работать только один поток, независимо от того, сколько у вас процессорных ядер. Потоки Python хороши только для ожидания ввода-вывода.

В отличие от этого, multiprocessing запускает параллельную виртуальную машину (интерпретатор Python) и делится с ней выбранными частями данных безопасным способом (путем копирование или использование общей памяти). Такие параллельные процессы могут работать параллельно и использовать несколько ядер ЦП.

Вкратце: Python потоки threads потоки ОС.

1 голос
/ 04 марта 2020

Думайте об этом так: «поток является частью процесса ».

«Процесс» владеет ресурсами, такими как память, открытый файл- ручки и сетевые порты и тд. Все эти ресурсы затем доступны каждому «потоку», которым владеет процесс. (По определению, каждый «процесс» всегда содержит хотя бы один («основной») «поток».)

ЦП и ядра, затем выполняйте эти «потоки» в контексте «процесса», который они принадлежат.

В многопроцессорной / многоядерной системе, поэтому возможно, что более одного потока, принадлежащего определенному процессу , действительно выполняется параллельно. Хотя в этом нельзя быть уверенным.

Кроме того: в контексте системы языков программирования на основе интерпретатора, такой как Python, реальная ситуация немного сложнее "за кадром", поскольку Python контекст интерпретатора существует и будет виден всем Python потокам. Это добавляет небольшое количество дополнительных накладных расходов, так что все это «просто работает».

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