0

(обратите внимание, что весь этот вопрос, хотя решение parrallel программирования, в основном оформлен в контексте/приложения питона 3.X)Разъяснения различий между параллельными потоками/процессами

На данный момент, я собираю от чтения является то, что:

a процесс, представляет собой набор инструкций вместе со всеми ресурсами, которые сопровождают его во время его работы. Он будет включать следующий код, а также входной/выходной/ресурс/память/дескриптор файла/etc. Другими словами, вся его кухня раковина.

# this script, while running as a whole, is considered a process 

print('hello world') 

with open('something.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 
print('job done!') 

Однако, если бы я хотел сделать больше в том же количестве времени - для того, чтобы максимизировать свои компьютеры перерабатывающие мощности - У меня есть возможность порождать больше процессов или потоков. Какой из них я выбираю, по сравнению с простой аналогией процесса скрипта python выше, какими они будут? Создает ли другой процесс эквивалент просто повторения всего объекта при изменении имени файла?

# changed filename (is this "another process?") 

print('hello world') 

with open('something_else.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 
print('job done!') 

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

# like would this be a "thread" a barebones "subset" of an entire program? 

with open('something.txt', 'a') as file_handle: 
    for i in range(500): 
     file_handle.write('blablabla') 

Каким образом эти два действительно отличаются друг от друга в любом случае? Поиск в Интернете Я понимаю, что процессы более независимы и тяжеловесны, а потоки более легкие и «легче обмениваются памятью друг с другом». Но что это значит? Почему процессы, связанные с обработкой, совместно используют память друг с другом? И если потоки могут «обмениваться памятью», то почему я не могу получить доступ к различным переменным из разных потоков, которые порождаются из одного и того же сценария (например, from thread_a import var_data)

И наконец, что именно вычисляет? Процессор вычисляет потоки или процессы? Или это всеобъемлющий термин, охватывающий несколько ядер/и т. Д. Нужно ли вычислять процессы или потоки ядра?


Резюме:

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

2) как процессы принципиально отличаются от потоков, что является примером процессов, способных делать то, что потоки не могут?

3) почему память/данные часто описываются как «труднее поделиться» в процессах, чем потоки? и как потоки обмениваются данными в любом случае?

4) Рассчитывают ли процессоры потоки или процессы. У сердечников вычисления потоков или процессов

5) Каковы некоторые общие рекомендации/примеры, когда использовать то, что

ответ

1

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

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

  • Threading представляет собой модуль, который позволяет порождать множество задач «в то же время» в разных потоках. Уловка заключается в том, что это не совсем в одно и то же время, но будет разрезано на атомные задачи и переключаться между различными задачами. НО у вас НИКОГДА не будет двух задач одновременно, поэтому вы все равно можете делиться памятью, как обычно, поэтому просто.

  • multiprocessing С другой стороны, позволяет создавать нереальные процессы, которые будут работать одновременно. НО цена заключается в том, что вы не можете безопасно делиться памятью между этими процессами (классическим способом). Нет проблем с тем, что в нем есть несколько процессов с несколькими потоками. Вы не совсем одиноки. Существует несколько способов безопасного обмена данными между процессами, например, с помощью Lock. Вы можете увидеть больше на этом here.

Подводя итоги, Threads and Process позволяет вам отделить некоторые задачи от других, давая вам способ улучшить вашу основную процедурную программу. В некоторых языках существует не так много различий в том, как они работают, но в Python главное помнить, являются:

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

  • Процессы: немного сложнее реализовать, поскольку вам нужно беспокоиться о памяти, которой вы обычно не пользуетесь в Python. Основной потенциал - вы можете значительно улучшить свои показатели, если ваш код можно распараллелить.

+0

Я хотел бы узнать больше о тонких нюансах потоков/процессов и более подробных механизмах их совместного использования ресурсами. Куда я могу пойти, чтобы узнать это? Будет ли это в рамках вводного курса ОС или параллельного программирования? Любые рекомендуемые материалы? (с фокусом на python, конечно) также, что, если бы у меня было 2 ядра, не было бы двух потоков, которые бы были ACTUALLly параллельно? – AlanSTACK

+0

Темы в Python никогда не являются параллельными, даже если у вас несколько ядер. Я думаю, вы должны пойти на параллельный курс программирования, а не на курс OS. И Threads, и Process не очень сложно начать, и тогда все зависит от вашего приложения. Вы можете найти много документации [здесь] (http://sebastianraschka.com/Articles/2014_multiprocessing_intro.html), [здесь] (https://pymotw.com/2/multiprocessing/communication.html), [здесь] (http://eli.thegreenplace.net/2012/01/04/shared-counter-with-pythons-multiprocessing). – CoMartel

+0

Вы должны действительно определить простое приложение и протестировать его с помощью Threads and Process. Если у вас есть вопрос о конкретном приложении и какой метод будет работать лучше, задайте другой вопрос об этом конкретном случае. – CoMartel

Смежные вопросы