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

Python Consullence: введение в потоках

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

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

Начиная

Мы начнем с простого примера, который просто демонстрирует, как работают потоки. Мы будем подкласс Нить Класс и сделайте его распечатать его имя для Stdout. Давайте получим кодирование!

В вышеупомянутом коде мы импортируем случайный модуль Python, модуль времени и импортируем класс потоков из модуля Threading. Далее мы подклассьте нить и сделаем переопределение его __init__ Способ принять аргумент, который мы расследуем «имя». Чтобы начать тему, вы должны позвонить в его Start () Метод, поэтому мы делаем это в конце init. Когда вы запускаете нить, он автоматически позвонит его Беги метод. Мы переопределили свой метод прогона, чтобы он выбирал случайное количество времени для сна. Random.randint Пример здесь вызовет Python случайным образом выбирать число от 3 до 15. Затем мы заставляем нить спать количество секунд, которые мы просто случайным образом решили имитировать его на самом деле что-то делать. Наконец мы распечатаем имя нити, чтобы пользователь узнал, что нить закончится.

create_threads Функция создаст 5 потоков, давая каждому из них уникальное имя. Если вы запустите этот код, вы должны увидеть что-то вроде этого:

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

Написание резьбового загрузчика

Предыдущий пример не был очень полезен, кроме как в качестве инструмента, чтобы объяснить, как работают потоки. Таким образом, в этом примере мы создадим класс потоков, который может скачать файлы из Интернета. Услуги внутреннего дохода США имеют множество форм PDF, которые у него есть его граждане для налогов. Мы будем использовать этот бесплатный ресурс для нашей демонстрации. Вот код:

Это в основном полный переписывание первого сценария. В этом мы импортируем модули OS и URLLIB2, а также модуль для резьбы. Мы будем использовать Urllib2, чтобы выполнить фактическую загрузку в классе потоков. Модуль ОС используется для извлечения имени файла, который мы загружаем, поэтому мы можем использовать его, чтобы создать файл с тем же именем на нашем компьютере. В классе DownloadThread мы настроили __init__, чтобы принять URL и имя для потока. В методе запуска мы открываем URL, извлеките имя файла, а затем используйте это имя файла для именования/создания файла на диске. Тогда мы используем в то время как Цикл, чтобы загрузить файл килобайт за раз и записать его на диск. После того, как файл завершится сохранение, мы распечатаем имя нити, а какой URL закончил загрузку.

Обновление:

Версия кода Python 3 немного отличается. Вы должны импортировать Урлыб вместо этого и использовать Urllib.request.urlopen вместо Urllib2.urlopen Отказ Вот версия Python 3:

Упаковка

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

Связанное чтение

  • Документация Python – Раздел 16.2: Threading
  • Пахновение Python: Пример очереди
  • Пахновение Python: Портирование из очереди на многопроцессорную