Многопроцессорная обработка внутри дочернего потока - PullRequest
0 голосов
/ 28 августа 2018

Я учился многопоточности и многопоточности.

Насколько я понимаю, потоки работают на одном и том же ядре, поэтому мне было интересно, если я создам несколько процессов внутри дочернего потока, будут ли они также ограничены этим единственным ядром?

Я использую Python, так что это вопрос об этом конкретном языке, но я хотел бы знать, то же самое с другими языками?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Каждая программа представлена ​​одним процессом. Процесс - это контекст выполнения, в котором работают один или несколько потоков. Все потоки в одном процессе совместно используют один и тот же транш виртуальной памяти, назначенной процессу.

Python (ссылающийся на CPython, например, у Jython и IronPython нет GIL) является особенным, поскольку он имеет глобальную блокировку интерпретатора (GIL) , которая предотвращает параллельный запуск многопоточного кода Python на нескольких ядрах. Только код, освобождающий GIL, может работать действительно параллельно (операции ввода-вывода и некоторые C-расширения, такие как numpy). Вот почему вам придется использовать модуль многопроцессорной обработки для связанного с процессором python-кода, который вам нужно запустить параллельно. Процессы начинаются с многопроцессорного модуля, затем запускается собственный экземпляр интерпретатора Python, чтобы вы могли обрабатывать код по-настоящему параллельно.

Обратите внимание, что даже однопоточное Python-приложение может работать на разных ядрах не параллельно, а последовательно, если ОС перенесет выполнение выполнения на другое ядро ​​после переключения контекста.

Вернуться к вашему вопросу:

если я создам несколько процессов внутри дочернего потока, будут ли они также ограничены этим единственным ядром?

Вы не создаете процессы внутри потока, вы порождаете новые независимые процессы Python с теми же ограничениями исходного процесса Python и над тем, какие ядра потоков новые процессы будут выполнять, зависит от ОС (... пока вы не манипулируете сродством ядра процесса, но давайте не будем туда идти).

0 голосов
/ 28 августа 2018

Я не эксперт по Pyhton, но я ожидаю, что это похоже на другие языки, потому что это функция ОС в целом.

Процесс

Процесс выполняется ОС и владеет одним потоком, который будет выполнен. Это вообще ваша программа. Вы можете запускать больше потоков внутри вашего процесса, чтобы выполнять сложные вычисления или делать то, что вам нужно. Но они принадлежат процессу.

Тема

Один или несколько потоков принадлежат процессу, и выполнение будет распределено по всем ядрам.

Теперь к вашему вопросу

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

Вы можете прочитать больше о понятии Gernal здесь: вытесняющая многозадачность

Есть несколько библиотек на разных языках, которые абстрагируют поток от того, что часто называют Задачей или чем-то еще. Для этих особых случаев возможно, что они просто работают внутри потока, в котором они были созданы. Например. В мире DotNet есть Тема и Задача. Часто люди неправильно используют термин поток, когда говорят о Задаче, которая в общем случае выполняется внутри потока, который она была создана.

...