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

Python Consulnency: портирование из очереди на многопроцессорную

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

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

Ранее на этой неделе я написал простой пост О очереди Python и продемонстрировали, как их можно использовать с резьбовым пулом для загрузки набора PDFS с веб-сайта службы внутренней доходов Соединенных Штатов. Сегодня я решил попробовать «портировать» этот код в многопроцессорный модуль Python. Как отметил один из моих читателей, очередей и нити Python ограничиваются запуском только на одном ядре из-за блокировки глобального интерпретатора (GIL), которая является частью Python. Многопроцессорный модуль (и Stackelless и несколько других проектов) могут работать на нескольких ядрах и юбках вокруг GIL (см. Документацию Если вам интересно). Во всяком случае, давайте начнем.

Создание многопроцессора приложения для загрузки

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

Вы должны получить что-то подобное, напечатано в Stdout:

Начальная загрузка F1040A.PDF Process-2 Запуск загрузки F1040.PDF Process - 1 Начальная загрузка F1040ES.PDF Process-4 Запуск загрузки F1040SB.PDF Process-5 Начальная загрузка F1040EZ.PDF Process-3

Давайте немного сломаем этот код. Сразу за BAT, вы заметите, что вы не подклассьте модуль многопроцессора, как вы делаете с Threading.Thread. Вместо этого мы просто создаем универсальный класс, который просто принимает список URL. После того, как мы создали класс, мы называем его Беги Способ, который переполняет URL-адреса и создает процесс для каждого из них. Он также добавит каждый процесс в список заданий. Причина, по которой мы делаем это потому, что мы хотим позвонить каждому процессу Присоединяйтесь к Метод, который, как вы могли ожидать, ждет процесс завершения. Если вы хотите, вы можете пройти номер к методу соединения, который в основном ожидается, что приведет к возврату присоединения, если процесс фактически завершен. Если вы этого не сделаете, то соединитесь заблокируйте на неопределенный срок.

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

Дополнительные ресурсы