Многопроцессорность против многопоточности Python

function extractUrlValue(key, url)
{
    if (typeof(url) === 'undefined')
        url = window.location.href;
    var match = url.match('[?&]' + key + '=([^&]+)');
    return match ? match[1] : null;
}

Если вы пытаетесь сопоставить «url» со ​​страницы, в которой находится посетитель, вы бы использовали следующий метод:

var value = extractUrlValue('url');

В противном случае вы можете передать настраиваемый URL-адрес, например

var value = extractUrlValue('url', 'http://www.test.info/link/?url=http://www.site2.com
687
задан Tshepang 27 January 2014 в 03:05
поделиться

5 ответов

Модуль threading использует потоки, модуль multiprocessing - процессы. Разница в том, что потоки работают в одном пространстве памяти, а процессы имеют отдельную память. Это немного усложняет совместное использование объектов между процессами при многопроцессорной обработке. Поскольку потоки используют одну и ту же память, необходимо принимать меры предосторожности, иначе два потока будут записывать в одну и ту же память одновременно. Для этого и нужна глобальная блокировка интерпретатора.

Порождение процессов происходит немного медленнее, чем порождение потоков. Когда они запущены, разница невелика.

651
ответ дан 22 November 2019 в 21:29
поделиться

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

Обратите внимание, что из-за GIL приложение на самом деле не делает две вещи одновременно, но то, что мы сделали, это поместили блокировку ресурсов базы данных в отдельный поток, чтобы процессорное время можно было переключать между ним и взаимодействием с пользователем. Процессорное время распределяется между потоками.

Многопроцессорная обработка предназначена для тех случаев, когда вам действительно нужно выполнить несколько задач в любой момент времени. Предположим, вашему приложению нужно подключиться к 6 базам данных и выполнить сложное матричное преобразование каждого набора данных. Размещение каждого задания в отдельном потоке может немного помочь, поскольку, когда одно соединение простаивает, другое может получить некоторое процессорное время, но обработка не будет выполняться параллельно, поскольку GIL означает, что вы используете ресурсы только одного процессора. Если поместить каждое задание в многопроцессорный процесс, каждое из них может работать на своем собственном процессоре и работать с полной эффективностью.

200
ответ дан 22 November 2019 в 21:29
поделиться

Вот несколько плюсов и минусов, которые я придумал.

Многопроцессорность

Плюсы

  • Отдельное пространство памяти
  • Код обычно простой
  • Использует преимущества нескольких процессоров и ядер
  • Избегает ограничений GIL для cPython
  • Устраняет большинство потребностей в примитивах синхронизации, если только вы используете разделяемую память (вместо этого это скорее модель взаимодействия для IPC)
  • Дочерние процессы можно прерывать / уничтожать
  • Python многопроцессорность Модуль включает полезные абстракции с интерфейсом, очень похожим на многопоточность. Поток
  • Обязательное условие cPython для обработки с привязкой к ЦП

Минусы

  • IPC немного сложнее с большими накладными расходами (модель связи по сравнению с общей памятью / объектами)
  • Больший объем памяти

Потоки

Плюсы

  • Легковесность - мало занимаемой памяти
  • Общая память - упрощает доступ к состоянию из другого контекста
  • Позволяет легко создавать адаптивные пользовательские интерфейсы
  • Модули расширения cPython C, которые должным образом выпускают GIL, будут работать параллельно
  • Отличный вариант для приложений с привязкой к вводу-выводу ion

Минусы

  • cPython - подчиняется GIL
  • Не прерываемый / убиваемый
  • Если не следует модели перекачки очереди команд / сообщений (с использованием модуля Queue ), тогда используйте ручное примитивов синхронизации становится необходимостью (решения необходимы для детализации блокировки)
  • Код обычно сложнее понять и разобраться в нем - вероятность состояния гонки резко возрастает
775
ответ дан 22 November 2019 в 21:29
поделиться

Главное преимущество - изоляция. Сбой процесса не приведет к остановке других процессов, тогда как сбойный поток, вероятно, нанесет ущерб другим потокам.

40
ответ дан 22 November 2019 в 21:29
поделиться

Еще одна вещь, о которой не упоминалось, это то, что скорость зависит от того, какую ОС вы используете. В Windows процессы стоят дорого, поэтому в windows лучше использовать потоки, но в unix процессы быстрее, чем их варианты в windows, поэтому использование процессов в unix гораздо безопаснее и быстрее порождается.

27
ответ дан 22 November 2019 в 21:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: