Многопроцессорность или многопоточность?

Я делаю программу для запуска симуляций на Python с интерфейсом wxPython. В программе вы можете создать симуляцию, и программа визуализирует (= вычисляет) ее для вас. Рендеринг иногда может занимать очень много времени.

Когда пользователь запускает симуляцию и определяет начальное состояние, я хочу, чтобы программа непрерывно отображала симуляцию в фоновом режиме, в то время как пользователь может делать разные вещи в программе. Что-то вроде заполняющейся полосы в стиле YouTube: вы можете воспроизводить симуляцию только до того момента, когда она была отрендерена.

Должен ли я использовать несколько процессов или несколько потоков или что? Люди советовали мне использовать пакет multiprocessing, я проверил его, и он выглядит хорошо, но я также слышал, что процессы, в отличие от потоков, не могут делиться большим количеством информации (и я думаю, что моя программа должна будет делиться большим количеством информации). .) Кроме того, я также слышал о Stackless Python: это отдельная опция? Понятия не имею.

Пожалуйста, порекомендуйте.


person Community    schedule 08.04.2009    source источник
comment
Я беспокоюсь о том, что вы, я думаю, моей программе нужно будет поделиться большим количеством информации - вы имеете в виду, что еще не знаете ?? Возможно, вам следует больше заниматься дизайном. Многопроцессорный модуль слабо совместим с многопоточным модулем, поэтому переключение не должно требовать больших усилий. Но остерегайтесь GIL, который заставит меня предпочесть многопроцессорность.   -  person CyberFonic    schedule 10.02.2010


Ответы (9)


"Я проверил, все выглядит хорошо, но я также слышал, что процессы, в отличие от потоков, не могут обмениваться большим количеством информации..."

Это верно лишь отчасти.

Потоки являются частью процесса — потоки тривиально разделяют память. Это не только помощь, но и проблема: два потока, игнорирующие друг друга, могут перезаписать память и создать серьезные проблемы.

Однако процессы обмениваются информацией посредством множества механизмов. Конвейер Posix (a | b) означает, что процессы a и b совместно используют информацию — a записывает ее, а b читает. Это работает очень хорошо для многих вещей.

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

Stackless Python не имеет отношения к этому обсуждению — он быстрее и имеет другое планирование потоков. Но я не думаю, что потоки - лучший способ для этого.

"Я думаю, что моя программа должна будет предоставить много информации."

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

«Сервер» — это еще одна архитектура, в которой несколько клиентских процессов получают и/или помещают информацию на центральный сервер. Это отличный способ поделиться информацией. Вы можете использовать эталонную реализацию WSGI для создания простого и надежного сервера.

person S.Lott    schedule 08.04.2009

  • Бесстековый: использует 1 ЦП. «Задания» должны сдаваться добровольно. Вариант с приоритетом работает не всегда.
  • Threaded: использует 1 ЦП. Собственные потоки распределяют время несколько случайным образом после запуска 20-100 опкодов Python.
  • Многопроцессорность: использует несколько процессоров.

Обновить

Углубленный анализ

Используйте резьбу для легкого времяпрепровождения. Однако, если вы вызываете подпрограммы C, которые занимают длительное время перед возвратом, то это может быть не вариант, если ваша подпрограмма C не освобождает блокировку.

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

Не используйте stackless, у меня раньше был segfault, и потоки в значительной степени эквивалентны, если только вы не используете сотни или более из них.

person Unknown    schedule 08.04.2009
comment
Это первый раз, когда я слышу, как кто-то говорит, что создание потоков — это легко. Многопоточный код IMO очень сложно написать хорошо. - person Bryan Oakley; 10.02.2010

В этом году на Pycon был хороший разговор о многопроцессорности. Вывод был следующим: «Используйте многопроцессорность только в том случае, если вы уверены, что у вас есть проблема, которую она решит, которую нельзя решить с помощью потоков; в противном случае используйте потоки».

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

Слайды и видео можно посмотреть здесь: http://blip.tv/pycon-us-videos-2009-2010-2011/introduction-to-multiprocessing-in-python-1957019

http://us.pycon.org/2009/conference/schedule/event/31/

person Vicki Laidler    schedule 09.04.2009
comment
Это прискорбно, так как это почти противоположно тому, что вы сделали бы на других языках, где это возможно. Потоки подвержены ошибкам и ограничены по сравнению с процессами, и в Python вы получаете проблему GIL, чтобы добавить оскорбление к травме. - person Kylotan; 09.04.2009
comment
Хотя верно то, что несколько процессов имеют небольшие накладные расходы во время выполнения (хотя это гораздо меньше, чем пять или десять лет назад), многопоточный код требует очень больших накладных расходов на программирование. Нужны умные люди, чтобы писать хороший многопоточный код, и очень умные люди, чтобы его отлаживать. - person Bryan Oakley; 10.02.2010
comment
Есть ли обновленная ссылка на эти слайды/выступление? Текущая ссылка не работает. - person Tyler; 28.12.2011
comment
На blip.tv есть видео 2011-2009 годов. Это похоже на многопроцессорную обработку от 2009 года: blip.tv/pycon-us-videos-2009-2010-2011/ - person gary; 14.07.2012
comment
Боже мой, используйте только X, если только Y, иначе Z будет действительно загадочной формулировкой. - person ubershmekel; 25.04.2013

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

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

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

Например, потенциально вы можете запустить 16 процессов на 8 двухъядерных компьютерах, но не получите преимущества от более чем 4 потоков на четырехъядерном компьютере. Если объем информации, которую вам нужно передать, невелик, многопроцессорная обработка может иметь больше смысла.

Что касается описанного вами стиля YouTube, я бы сказал, что он предполагает многопроцессорность. Если вы следуете подходам MVC, ваш графический интерфейс не должен также содержать модель (результат расчета). С помощью многопроцессорности вы можете связаться с менеджером работ, который может сообщить, какие данные уже доступны.

person Uri    schedule 08.04.2009
comment
процессы могут совместно использовать одну и ту же память в режиме только для чтения, я думаю, что это будет очень полезно для меня. Как я могу это сделать? - person Ram Rachum; 09.04.2009
comment
В большинстве систем UNIX, когда вы разветвляете процесс (создаете один из другого), они должны совместно использовать одни и те же страницы чтения, пока не начнут запись. Это экономит загрузку программного кода. Но это не так полезно, как метод программирования. - person Uri; 09.04.2009
comment
К сожалению, в Windows это не так (в Windows нет os.fork). - person Jon Cage; 06.05.2009

В CPython несколько потоков не могут выполняться одновременно из-за GIL: текст ссылки.

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

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

person Bastien Léonard    schedule 08.04.2009

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

Между прочим, несколько участников проекта Mozilla (в частности, Брендан Эйх, технический директор Mozilla и создатель JavaScript) особенно критически относились к многопоточности. На некоторые материалы есть ссылки здесь, здесь, здесь и здесь подтверждает такой вывод.

Надеюсь, что это поможет и удачи.

person Brian M. Hunt    schedule 14.04.2009

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

Если вы решили использовать обработанный, обмен информацией между подпроцессами может осуществляться несколькими способами: соединения tcp/udp, общая память или каналы. Это добавляет некоторые накладные расходы и сложность.

person Shane C. Mason    schedule 08.04.2009
comment
+1: многопоточность — это очень, очень естественный формат для работы с графическими интерфейсами, управляемыми событиями, и он помогает вам избежать боли межпроцессного взаимодействия (если только ваши потребности в обмене информацией не подходят для ограниченных вариантов, упомянутых Шейном). - person ojrac; 09.04.2009
comment
1. Будут ли потоки автоматически использовать все ядра процессора? 2. Вы представляете, как во все это вписывается Stackless? - person Ram Rachum; 09.04.2009
comment
Дело в том, что потоки «обычно» находятся под контролем ОС, и все ОС довольно хорошо распределяют нагрузку между процессорами. Как правило, это то поведение, которое вам нужно. Однако вы можете представить себе сценарии, в которых вы хотели бы передать одну задачу одному процессору. - person Shane C. Mason; 09.04.2009
comment
НЕТ. Глобальная блокировка интерпретатора Python требует, чтобы только ОДИН поток мог получить доступ к интерпретатору за раз. Таким образом, вы не можете воспользоваться преимуществами многоядерных процессоров, использующих потоки Python. - person Jason Baker; 09.04.2009
comment
Джейсон говорит правду: GIL не допускает одновременного выполнения на нескольких процессорах. Я должен был быть более четким в своем заявлении, ОС решает, на каком ЦП она будет работать, и вы увидите, как ваше приложение переключает ЦП во время выполнения. - person Shane C. Mason; 09.04.2009
comment
Спасибо, Джейсон. Это самое важное для меня. - person Ram Rachum; 09.04.2009

Очень озадачен. Бастьен Леонар справедливо заметил, что GIL лишает возможности использовать многопоточность каким-либо полезным образом. В его справке говорится:

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

В этом случае многопроцессорная обработка является разумным выбором. По моему собственному опыту, Python + MT не приносит заметной пользы пользователю.

person Community    schedule 13.03.2016

Похоже, вам нужна многопоточность.

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

То, что вы пытаетесь получить, — это более отзывчивые дисплеи, позволяя пользователю взаимодействовать и обновлять графику во время моделирования. Это именно то, для чего была создана многопоточность Python.

Чего это вам НЕ даст, так это возможности использовать преимущества нескольких ядер/процессоров в вашей системе. Я понятия не имею, как выглядит ваша симуляция, но если она сильно загружает ЦП, она может быть хорошим кандидатом на разделение. В этом случае вы можете использовать многопроцессорность для запуска отдельных частей симуляции на отдельных ядрах/процессорах. Однако это не тривиально... теперь вам нужен какой-то способ передачи данных между процессами, так как отдельные процессы не могут легко получить доступ к одному и тому же пространству памяти.

person teeks99    schedule 09.04.2009