Есть ли причина этой разницы между потоками и процессами Python?

Когда объект списка передается процессу и потоку python (3.9), дополнения к объекту списка, сделанные в нить, видны в родительском объекте, но не добавления, сделанные в процесс. например,

from multiprocessing import Process
from threading import Thread


def job(x, out):
    out.append(f'f({x})')


out = []
pr = Process(target=job, args=('process', out))
th = Thread(target=job, args=('thread', out))
pr.start(), th.start()
pr.join(), th.join()
print(out)

Это печатает ['f(thread)']. Я ожидал, что это будет (не обращайте внимания на порядок) ['f(thread)', 'f(process)'].

Может ли кто-нибудь объяснить причину этого?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом нет ничего специфичного для Python; именно так работают процессы.

В частности, все потоки, работающие в данном процессе, совместно используют пространство памяти процесса, так что, например. если поток A изменяет состояние переменной, поток B "увидит" это изменение.

Процессы, OTOH, получают свое личное пространство памяти, недоступное для всех других процессов. Это делается преднамеренно, чтобы предотвратить случайное (или преднамеренное) чтение процессом A или повреждение памяти процесса B.

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

Ах, не могли бы вы указать мне ресурс, где я мог бы читать дальше?

scribe 09.04.2022 05:36

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

scribe 09.04.2022 05:40

@scribe Специфика python заключается в том, что управление памятью python не является потокобезопасным, поэтому одновременно может выполняться только один поток для каждого процесса. Что касается умножения матриц, то самым быстрым вариантом на самом деле было бы использование numpy, который в основном написан на c и фортране, и поэтому могу (и работает) запускает более одного потока за раз (и компилируется в машинный код, который быстрее, чем интерпретируемый код)

Aaron 09.04.2022 18:59

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

scribe 10.04.2022 05:42

@scribe с numpy, либо потоки, либо процессы должны дать вам ускорение. Предположительно, вы захотите, чтобы все результаты были в одном месте в какой-то момент, а это означает, что при маршруте с несколькими процессами вам нужно будет передавать результаты из одного процесса в другой. При многопоточном подходе все ваши результаты уже будут находиться в одном и том же пространстве памяти, что, вероятно, является для вас выигрышем в эффективности, поскольку позволяет избежать шага передачи результатов.

Jeremy Friesner 10.04.2022 06:06

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

scribe 10.04.2022 06:21

Это было бы верно, если бы вы выполняли умножение матрицы с использованием кода Python, но, как отметил @Aaron выше, вычисления Numpy реализованы на C, поэтому ограничение GIL интерпретатора Python на них не влияет.

Jeremy Friesner 10.04.2022 06:22

Другие вопросы по теме

Невозможно записать/прочитать значение в/из зарегистрированного общего объекта с многопроцессорным сервером BaseManager в нескольких процессах
Как добавить множество диапазонов подмножества в новый фрейм данных после некоторой фильтрации?
Как избежать блокировки цикла событий asyncio с помощью циклических функций
Многопроцессорность Python, как вернуть переменные для процесса, который можно отменить
Задача, связанная с ЦП — производительность многопроцессорного подхода намного хуже, чем у синхронного подхода — почему?
Как работает after() и многопроцессорность с использованием tkinter
Использование concurrent.futures с бесконечным итератором и критериями остановки
Многопроцессорные вызовы Python становятся медленнее для более поздних вызовов
Ошибка выполнения при попытке запустить несколько процессов (обнаружение изображения и печать на терминал)
Многопроцессорная обработка нескольких файлов в цикле и сохранение результатов в словаре (python 3)