Тхреадинг значајно смањује време извршавања програма. Научите како да имплементирате тхреадинг у Питхон-у.

Време извршења је једно од уобичајених мерила ефикасности програма. Што је време извршења брже, то је програм бољи. Тхреадинг је техника која омогућава програму да обавља више задатака или процеса истовремено.

Научићете како да користите уграђени Питхон навојем модул и истовремено.особине модул. Оба ова модула нуде једноставне начине за креирање нити за управљање њима

Важност Тхреадинг-а

Тхреадинг смањује количину времена потребног програму да заврши посао. Ако посао садржи више независних задатака, можете користити нит за истовремено покретање задатака, смањујући време чекања програма да се један задатак заврши пре него што пређете на следећи.

На пример, програм који преузима више сликовних датотека са интернета. Овај програм може да користи нити да преузима датотеке паралелно, а не једну по једну. Ово елиминише време које би програм морао да чека да се процес преузимања једне датотеке заврши пре него што пређе на следећу.

instagram viewer

Почетни програм пре увођења нити

Функција у следећем програму представља задатак. Задатак је паузирање извршавања програма на једну секунду. Програм позива функцију два пута и тако креира два задатка. Затим израчунава време потребно да се цео програм покрене, а затим га приказује на екрану.

увоз време

старт_тиме = тиме.перф_цоунтер()

дефпауза():
штампа ('Спавање 1 секунда...')
тиме.слееп(1)
штампа ('Готово спавање...')

пауза()
пауза()
завршетак_време = време.перф_цоунтер()
штампа (ф'Завршено {роунд (финисх_тиме - старт_тиме, 2)} секунда (с)')

Излаз показује да је програму било потребно 2,01 секунде да се изврши. Сваки задатак је трајао једну секунду, а остатку кода је било потребно 0,01 секунду да се изврши.

Можете користити нити за истовремено извршавање оба задатка. Ово ће оба задатка извршити једну секунду.

Имплементација Тхреадинг Модула

Да бисте изменили почетни код за имплементацију навоја, увезите навојем модул. Направите две нити, тхреад_1 и тхреад_2 помоћу Тхреад класа. Звати почетак методу на свакој нити да започне њено извршавање. Звати придружити метод на свакој нити да сачека да се њихово извршење заврши пре него што се изврши остатак програма.

увоз време
увоз навојем
старт_тиме = тиме.перф_цоунтер()

дефпауза():
штампа ('Спавање 1 секунда...')
тиме.слееп(1)
штампа ('Готово спавање...')

нит_1 = нит. Нит (циљ=пауза)
нит_2 = нит. Нит (циљ=пауза)

тхреад_1.старт()
тхреад_2.старт()

тхреад_1.јоин()
тхреад_2.јоин()

завршетак_време = време.перф_цоунтер()
штампа (ф'Завршено {роунд (финисх_тиме - старт_тиме, 2)} секунда (с)')

Програм ће истовремено покренути обе нити. Ово ће смањити количину времена потребног да се изврши оба задатка.

Излаз показује да је време потребно за извршавање истих задатака око једне секунде. Ово је упола мање времена за почетни програм.

Имплементација Тхреадинг-а помоћу модула цонцуррент.футурес

Питхон 3.2 је видео увођење истовремено.футурес модул. Овај модул обезбеђује интерфејс високог нивоа за извршавање асинхроних задатака помоћу нити. Пружа једноставнији начин паралелног извршавања задатака.

Да бисте модификовали почетни програм да користи нит, увезите модул цонцуррент.феатурес. Користити ТхреадПоолЕкецутор класе из модула цонцуррент.футурес за креирање групе нити. Пошаљите пауза функција до базена два пута. Тхе прихвати метода враћа а будућност објекат који представља резултат позива функције.

Итерирајте преко будућности и одштампати своје резултате користећи резултат методом.

увоз време
увоз истовремено.футурес

старт_тиме = тиме.перф_цоунтер()

дефпауза():
штампа ('Спавање 1 секунда...')
тиме.слееп(1)
повратак'Готово спавање...'

са истовремено.футурес. ТхреадПоолЕкецутор() као извршилац:
резултати = [екецутор.субмит (пауза) за _ ин домет(2)]
за ф ин цонцуррент.футурес.ас_цомплетед (резултати):
принт (ф.ресулт())

завршетак_време = време.перф_цоунтер()

штампа (ф'Завршено {роунд (финисх_тиме - старт_тиме, 2)} секунда (с)')

Модул цонцуррент.феатурес се брине о покретању и придруживању нити за вас. Ово чини ваш код чистијим.

Излаз је идентичан као код модула за урезивање навоја. Модул за увлачење нити је користан за једноставне случајеве када треба да покренете неколико нити паралелно. С друге стране, модул цонцуррент.футурес је користан за сложеније случајеве где морате истовремено да покренете много задатака.

Коришћење Тхреадинг-а у стварном светском сценарију

Коришћење нити за покретање горњег програма смањило је време за једну секунду. У стварном свету, нити штеде више времена. Направите програм који преузима слике са интернета. Старт би стварање новог виртуелног окружења. Покрените следећу команду у терминалу да бисте инсталирали захтева библиотека:

захтеви за инсталацију пип-а

Библиотека захтева ће вам омогућити да шаљете ХТТП захтеве. Увезите библиотеку захтева и временску библиотеку.

увоз захтева
увоз време

Направите листу УРЛ адреса слика које желите да преузмете. Нека их буде најмање десет како бисте приметили значајну разлику када имплементирате тхреадинг.

имг_урлс = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

Пређите преко листе УРЛ-ова који преузимају сваку слику у исту фасциклу која садржи ваш пројекат. Прикажите време потребно за преузимање слика одузимањем времена завршетка од времена почетка.

старт_тиме = тиме.перф_цоунтер()
за имг_урл ин имг_урлс:
имг_битес = рекуестс.гет (имг_урл).цонтент
имг_наме = имг_урл.сплит('/')[3]
имг_наме = ф'{имг_наме}.јпг'
са отвори (имг_наме, 'вб') као имг_филе:
имг_филе.врите (имг_битес)
штампа (ф'{имг_наме} је преузето...')
завршетак_време = време.перф_цоунтер()
штампа (ф'Завршено {финисх_тиме - старт_тиме} секунде')

Програму је потребно око 22 секунде да преузме 12 слика. Може се разликовати за вас јер време потребно за преузимање слика зависи и од брзине вашег интернета.

Измените програм тако да користи тхреадинг користећи модул цонцуррент.феатурес. Уместо петље, користите функцију. Ово је функција коју ћете проследити извршилац инстанце.

увоз захтева
увоз време
увоз истовремено.футурес

имг_урлс = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

старт_тиме = тиме.перф_цоунтер()

дефдовнлоад_имаге(имг_урл):
имг_битес = рекуестс.гет (имг_урл).цонтент
имг_наме = имг_урл.сплит('/')[3]
имг_наме = ф'{имг_наме}.јпг'
са отвори (имг_наме, 'вб') као имг_филе:
имг_филе.врите (имг_битес)
штампа (ф'{имг_наме} је преузето...')

са истовремено.футурес. ТхреадПоолЕкецутор() као извршилац:
екецутор.мап (довнлоад_имаге, имг_урлс)

завршетак_време = време.перф_цоунтер()

штампа (ф'Завршено {финисх_тиме-старт_тиме} секунде')

Након увођења навоја. Време се значајно смањује. Било је потребно само 4 секунде да се заврши извршавање програма.

Сценарији погодни за Тхреадинг

Неки од сценарија који су погодни за нит су:

  • И/О везани задаци: Ако програм проведе већину времена чекајући да се заврше улазне или излазне операције. Тхреадинг може побољшати перформансе дозвољавајући другим задацима да се извршавају док се чека да се И/О операције заврше.
  • Веб сцрапинг: Веб стругање укључује прављење ХТТП захтева и рашчлањивање ХТМЛ одговора. Тхреадинг помаже да се убрза процес омогућавајући вам да истовремено направите више захтева.
  • Задаци везани за ЦПУ: Тхреадинг може помоћи у побољшању перформанси дозвољавајући да се више задатака извршавају паралелно.

Упознајте се са увођењем нити на другим језицима

Питхон није једини језик који подржава нити. Већина програмских језика подржава неки облик нити. Важно је да се упознате са имплементацијом нити на другим језицима. Ово вас оспособљава са неопходним вештинама да се ухватите у коштац са различитим сценаријима у којима се може применити нит.