Рубрики
Без рубрики

Многопроцессор против многопотативного в Python: что вам нужно знать.

Автор оригинала: FreeCodeCapm Team.

Timber.io.

Что такое нить? Почему вы можете этого хотеть?

Python – это линейный язык. Тем не менее, модуль для резьбы пригодится, когда вы хотите немного больше энергии обработки.

Резьба в Python не может быть использована для расчетов Parallel CPU. Но он идеально подходит для операций ввода/вывода, таких как веб-соскабливание, потому что процессор сидит холостой ожидания данных.

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

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

Для процессов интенсивных процессов мало пользы для использования модуля Threading.

Резьба включена в стандартную библиотеку:

import threading from queueimport Queueimport time

Вы можете использовать цель Как вызываемый объект, args пройти параметры на функцию, а Начать запустить нить.

def testThread(num):    print numif __name__ == '__main__':    for i in range(5):        t = threading.Thread(target=testThread, arg=(i,))        t.start()

Если вы никогда не видели Если __name__: Раньше в основном это способ убедиться, что код, который вложен внутри, он будет работать только в том случае, если скрипт работает напрямую (не импортировано).

Замок

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

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

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

Вы можете использовать печатную блокировку, чтобы убедиться, что только один нить может печатать одновременно. Это предотвращает попадание текста (и вызывая повреждение данных) при печати.

В приведенном ниже Код у нас есть десять рабочих мест, которые мы хотим сделать, и пять работников, которые будут работать на работе:

print_lock = threading.Lock()def threadTest():    # when this exits, the print_lock is released    with print_lock:        print(worker)def threader():  while True:    # get the job from the front of the queue    threadTest(q.get())    q.task_done()q = Queue()for x in range(5):    thread = threading.Thread(target = threader)    # this ensures the thread will die when the main thread dies    # can set t.daemon to False if you want it to keep running    t.daemon = True    t.start()for job in range(10):    q.put(job)

Метутинг не всегда идеальный раствор

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

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

Что такое многопроцессорное? Как это отличается от резьбы?

Без многопроцессора, программы Python имеют проблемы с максимальными характеристиками вашей системы из-за Гил (Блокировка глобального переводчика). Python не был разработан, учитывая, что персональные компьютеры могут иметь более одного ядра (что показывает, сколько лет этому языку).

Гил необходим, потому что Python не безопасен в потоке, и при доступлении к объекту Python находится глобально принудительный замок. Хотя не идеально, это довольно эффективный механизм управления памятью. Что мы можем сделать?

Многопроцессор позволяет создавать программы, которые могут работать одновременно (в обход GIL) и используют все возможности вашего CPU CORE. Хотя он принципиально отличается от библиотеки потоков, синтаксис очень похож. Многопроцессорная библиотека дает каждому процессу свой собственный интерпретатор Python, и каждый их собственный GIL.

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

Давайте начнем

import multiprocessingdef spawn():  print('test!')if __name__ == '__main__':  for i in range(5):    p = multiprocessing.Process(target=spawn)    p.start()

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

for i in range(5):  p = multiprocessing.Process(target=spawn)  p.start()  p.join() # this line allows you to wait for processes

Если вы хотите пройти аргументы в свой процесс, вы можете сделать это с args :

import multiprocessingdef spawn(num):  print(num)if __name__ == '__main__':  for i in range(25):    ## right here    p = multiprocessing.Process(target=spawn, args=(i,))    p.start()

Вот аккуратный пример, потому что числа не приходят в порядке, вы бы ожидаете (без p.join () ).

Недостатки

Как с резьбой, есть еще недостатки с многопроцессорами … Вы должны выбрать свой яд:

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

Заключение

Когда вы должны использовать многопоточность VS Multipressing?

  • Если ваш код имеет много ввода/вывода или использования сети, многопоточность – это ваша лучшая ставка из-за его низкого накладных расходов.
  • Если у вас есть графический интерфейс, используйте многопоточность, чтобы нить UI не заблокирована.
  • Если ваш код является границей CPU, вы должны использовать многопроцессорную (если ваша машина имеет несколько ядер)

Просто отказ от ответственности: мы здесь лесозаготовительная компания @ Timber. Мы бы понравились, если вы попросили наш продукт (Это серьезно здорово!), Но это все, что мы собираемся рекламировать это.

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

Первоначально опубликовано timber.io .