Многопоточност чрез пример - модул за резби

Python включва редица различни паралелни конструкции като резбоване, опашки и многообработка. Модул резбоване използвани като основен начин за постигане на паралелизъм. Преди няколко години многопроцесорният модул беше добавен към стандартния библиотечен пакет на Python. В тази статия ще се съсредоточим върху това как да използваме опашки и нишки.

Използване на потоци

Ще започнем с прост пример, който показва как работят нишките. Ще наследим класа Thread от класа MyThread и ще посочим, че името му се показва като stdout. Да опитаме!

В този код импортирахме произволните и времеви модули и също така импортирахме класа Thread от модула за резби на Python. След това наследяваме класа Тема, и замени своя метод __init__, за да приеме аргумент, наречен име. За да стартирате поток, трябва да извикате метода старт().

След стартиране на нишката той автоматично ще извика метода бягай. Предефинирахме метод на изпълнение така че той избира случаен момент за "сън". Пример произволен.пранд казва на Python да избере произволно число между 3 и 15. След това казваме на нишката да „заспи“ толкова секунди, колкото е избрана на случаен принцип, за да симулира как действително работи. След това въведохме името на потока, за да кажем на потребителя, че е приключил. Функция create_threads ще създаде 5 нишки, давайки на всяка от тях уникално име. Ако стартирате този код, ще видите нещо подобно:

Изходният ред ще бъде различен всеки път. Опитайте да стартирате кода няколко пъти, за да видите промяната на реда. Сега нека напишем нещо по-практично.!

Писане на стрийминг товарач

Предишният пример не беше много полезен като инструмент за показване как точно работят нишките на Python. Така че в този пример ще създадем клас Thread, който изтегля паралелно файлове от интернет. Ще използваме безплатен ресурс в нашата демонстрация. Нека да разгледаме кода:

Като цяло това е напълно пренаписан първи сценарий. Тук сме импортирали нашите os модули, urllib2, и нишки на python. Ние използваме urllib2 за да се зареди директно в класа на потока. Използваме модула os, за да извлечем името на файла, който зареждаме, за да можем да го използваме, за да създадем файл със същото име на нашия компютър. В час DownloadThread настройваме __в него__ да приеме URL и заглавия за потока. В метода на изпълнение отваряме URL адреса, извличаме името на файла и след това използваме това име, за да създадем файл на диск.

След това използваме цикъл, за да изтегляне на файл по килобайт наведнъж и го запазете на диск. След като файлът бъде запазен, показваме името на потока и заредения URL адрес. В Python 3 този код е малко по-различен. Трябва да импортираме urllib вместо urllib2 и да използваме urllib.request.urlopen вместо urllib2.urlopen. Ето кода, където можете да видите разликата:

Използване на опашки

Опашки (Python Queues) могат да се използват за стека първи в първи изход (FIFO)) или „последно влизане - последно излизане“ (последно влизане - последно излизане (LILO)) ако ги използвате правилно.

В този раздел ще смесим потоците и ще създадем прост скрипт за зареждане на файлове, за да демонстрираме как Python Queues работи със случаите, които искаме да паралелизираме. За да ви помогне да обясните как Опашки, ще пренапишем скрипта за стартиране от предишния раздел, за да го използваме Опашки. Да започваме!

Нека обобщим

Вече знаете как да използвате потоци и опашки, както на теория, така и на практика. Потоците са особено полезни, когато създавате потребителски интерфейс и трябва да поддържате този потребителски интерфейс използваем. Без нишки потребителският интерфейс може спрете да реагирате и закачете, докато качвате голям файл или правите заявка за голяма база данни. За да избегнете това, трябва да стартирате продължителни процеси в нишки и да ги свържете към вашия интерфейс.