Овај водич ће бити фокусиран на једну од важних тема за Питхон, ГИЛ. Такође ћемо покрити како ГИЛ утиче на перформансе Питхон програма са имплементацијом кода. Пре него што уђемо у ову тему, хајде да имамо основну идеју о ГИЛ-у.
ГИЛ или Глобална брава тумача
Питхон Глобал Интерпретер Лоцк или ГИЛ је важан део вишенитног програмирања. То је тип закључавања процеса који се користи када се ради са више процеса. Даје контролу само једној нити. Генерално, Питхон користи једну нит за покретање једног процеса. Добијамо исте резултате перформанси једнонитних и вишенитних процеса који користе ГИЛ. Ограничава постизање вишенитности у Питхон-у јер спречава нити и ради као једна нит.
Напомена – Питхон не подржава вишенитност јер нам пакети за обраду нити не могу дозволити да користимо више ЦПУ језгара.
Зашто програмери Питхон-а користе ГИЛ?
Питхон обезбеђује јединствену функцију бројача референци, која се користи за управљање меморијом. Бројач референци броји укупан број референци направљених интерно у Питхон-у да би доделио вредност објекту података. Када број референци достигне нулу, додељена меморија објекта се ослобађа. Погледајмо пример у наставку.
Пример -
матх цласс јава
import sys a = [] b = a sys.getrefcount(a)
Главна брига у вези са променљивом броја референци је то што на њу може утицати када две или три нити покушавају да повећају или смање њену вредност истовремено. Познато је као стање расе. Ако дође до овог стања, може доћи до цурења меморије која се никада не ослобађа. Може доћи до пада или грешака у Питхон програму.
ГИЛ нам помаже да уклонимо такву ситуацију тако што користимо закључавање свих дељених структура података у нитима тако да се оне не мењају недоследно. Питхон пружа једноставан начин за имплементацију ГИЛ-а јер се бави управљањем меморијом сигурним у нити. ГИЛ захтева да понудите једно закључавање нити за обраду у Питхон-у. Повећава перформансе једнонитног програма јер је потребно руковати само једним закључавањем. Такође помаже да се направи било који програм везан за ЦПУ и спречава стање застоја.
инт у стринг јава
Утицај на вишенитне Питхон програме
Постоји разлика између ЦПУ-граница у њиховим перформансама и И/О везаних за типичан Питхон програм или било који рачунарски програм. Програми везани за ЦПУ генерално потискују ЦПУ до његових граница. Ови програми се генерално користе за математичко израчунавање као што су множење матрица, сагоревање, обрада слика итд.
И/О повезани програми су они програми који троше време да би добили улаз/излаз који може да генерише корисник, датотека, база података, мрежа итд. Такви програми морају да чекају неко значајно време док извор не обезбеди улаз. С друге стране, извор такође има своје време обраде. На пример – корисник размишља шта да унесе као улаз.
Хајде да разумемо следећи пример.
Пример -
import time from threading import Thread COUNT = 100000000 def countdown(num): while num>0: num -= 1 start_time = time.time() countdown(COUNT) end_time = time.time() print('Time taken in seconds -', end_time - start_time)
Излаз:
Time taken in seconds - 7.422671556472778
Сада мењамо горњи код покретањем две нити.
Пример - 2:
import time from threading import Thread COUNT = 100000000 def countdown(num): while num>0: num -= 1 thread1 = Thread(target=countdown, args=(COUNT//2,)) thread2 = Thread(target=countdown, args=(COUNT//2,)) start_time = time.time() thread1.start() thread2.start() thread1.join() thread2.join() end_time = time.time() print('Time taken in seconds -', end_time - start_time)
Излаз:
Time taken in seconds - 6.90830135345459
Као што видимо да је за оба кода требало исто време да се заврше. ГИЛ је спречио паралелно извршавање нити везаних за ЦПУ у другом коду.
компјутер измислио које године
Зашто ГИЛ још увек није уклоњен?
Многи програмери имају притужбе у вези са овим, али Питхон не може донети промене тако значајне као уклањање ГИЛ-а. Други разлог је што ГИЛ до сада није побољшан. Ако се промени у Питхон 3, то ће створити озбиљне проблеме. Уместо уклањања ГИЛ-а, ГИЛ концепт се може побољшати. Према Гвиду ван Росому -
„Поздравио бих сет закрпа у Пи3к само ако се перформансе за једнонитни програм (и за вишенитни али И/О-везани програм) не смањују“.
Такође постоји много доступних метода које решавају исти проблем који решава ГИЛ, али их је тешко применити.
Како се носити са Питхоновим ГИЛ-ом
Коришћење вишепроцесирања је најпогоднији начин да се програм спречи од ГИЛ-а. Питхон нуди различите интерпретаторе за сваки процес који се покреће, тако да се у том сценарију појединачна нит обезбеђује сваком процесу у вишеструкој обради. Хајде да разумемо следећи пример.
Пример -
пвр пуна форма
from multiprocessing import Pool import time COUNT = 50000000 def countdown(num): while num>0: num -= 1 if __name__ == '__main__': pool = Pool(processes=2) start_time = time.time() r1 = pool.apply_async(countdown, [COUNT//2]) r2 = pool.apply_async(countdown, [COUNT//2]) pool.close() pool.join() end_time = time.time() print('Time taken in seconds -', end_time - start_time)
Излаз:
Time taken in seconds - 3.3707828521728516
Можда се чини да су пристојне перформансе повећане, али управљање процесима има своје трошкове и вишеструки процеси су тежи од више нити.
Закључак
У овом водичу смо разговарали о ГИЛ-у и како га можемо користити. Даје контролу једној нити да се изврши у тренутку. Овај водич је такође покрио зашто је ГИЛ важан за Питхон програмере.