Я узнал о многопроцессорной обработке и многопоточности.
Насколько я понимаю, потоки выполняются на одном ядре, поэтому мне было интересно, могу ли я создать несколько процессов внутри дочернего потока, они будут ограничены этим ядром?
Я использую python, так что это вопрос об этом конкретном языке, но я хотел бы знать, совпадает ли это с другими языками?
Я не эксперт по pyhton, но я ожидаю, что это похоже на другие языки, потому что это ОС в целом.
Операция выполняется ОС и имеет один поток, который будет выполнен. Это вообще ваша программа. Вы можете запустить больше потоков внутри своего процесса, чтобы выполнить тяжелые вычисления или что-то еще, что вам нужно сделать. Но они принадлежат процессу.
Один или несколько потоков принадлежат процессу, и выполнение будет распределено по всем ядрам.
Когда вы создаете определенное количество потоков, эти потоки должны быть распределены по всем вашим ядрам. Они не ограничены ядром, выполняющим фитон-интерпретатор. Даже когда вы создаете подпроцесс из вашего фитон-кода, процесс может и должен работать на других ядрах.
Вы можете больше узнать о концепции gernal: Упреждающая многозадачность
Есть несколько библиотек на разных языках, которые абстрагируют поток к чему-то, часто называемому "Задачей" или чем-то другим. Для этих особых случаев возможно, что они просто запущены внутри потока, в котором они были созданы. Например. В мире DotNet есть Тема и Задача. Часто люди злоупотребляют термином "поток", когда они говорят о задаче, которая в общем работает в потоке, который был создан.
Каждая программа представляется через один процесс. Процесс - это контекст выполнения, в котором работает один или несколько потоков. Все потоки в одном процессе имеют один и тот же транш виртуальной памяти, назначенный процессу.
Python (ссылка на CPython, например Jython и IronPython, не имеет GIL) является особенной, поскольку она имеет глобальную блокировку интерпретатора (GIL), которая предотвращает параллельный запуск многопоточного ядра на нескольких ядрах. Только код, освобождающий GIL, может работать по-настоящему параллельно (операции ввода-вывода и некоторые C-расширения, такие как numpy). Для этого вам придется использовать модуль многопроцессорности для cpu-связанного кода python, который вам нужно запустить параллельно. Процессы startet с модулем многопроцессорности затем будут запускать собственный экземпляр интерпретатора python, чтобы вы могли обрабатывать код по-настоящему параллельно.
Обратите внимание, что даже однопотоковое python-приложение может работать на разных ядрах, а не параллельно, но последовательно, в случае, если ОС перераспределяет выполнение в другое ядро после переключения контекста.
Вернуться к вашему вопросу:
если я создам несколько процессов внутри дочернего потока, они будут ограничены этим ядром?
Вы не создаете процессы внутри потока, вы создаете новые независимые процессы python с теми же ограничениями исходного процесса python и на каких ядрах будут выполняться потоки новых процессов вплоть до ОС (... поскольку вы долго манипулировать ядро-сродством процесса, но не отходить туда).