Sobes.tech
Junior — Middle

Ինչու Python-ում բազմամյա օգտագործումը չի հանգեցնում նկատելի արագացման՝ ծանր CPU-կախված հաշվարկների կատարման ժամանակ?

sobes.tech AI

Պատասխան AI-ից

Նախնական Python-ի իրականացման մեջ, CPython օգտագործում է GIL (Global Interpreter Lock) — գլոբալ ինտերպրետատորի արգելք, որը թույլ է տալիս կատարել միայն մեկ Python բայթկոդ միաժամանակ մեկ թելում: Հետևաբար, բազմաթելային աշխատանքը չի բերում կատարողականության աճ ծանր հաշվարկներում, որոնք կախված են CPU-ից, քանի որ թելերը իրականում չեն կարող միաժամանակ աշխատել մի քանի միջուկներում:

Այս սահմանափակումը հաղթահարելու համար օգտագործվում են՝

  • Բազմապրոցեսային աշխատանք (multiprocessing մոդուլ), որտեղ յուրաքանչյուր պրոցես ունի իր սեփական ինտերպրետատորը և GIL-ը:
  • C ընդարձակումների օգտագործում, որոնք ազատում են GIL-ը հաշվարկների ժամանակ:
  • Այլընտրանքային Python իրականացումներ առանց GIL-ի (օրինակ, Jython, IronPython):

Բազմապրոցեսային օգտագործման օրինակ՝ համաժամանակյա հաշվարկների համար:

from multiprocessing import Pool

def heavy_calc(x):
    # Ծանր CPU-կապված ֆունկցիա
    return x * x

if __name__ == '__main__':
    with Pool(4) as p:
        results = p.map(heavy_calc, range(10))
    print(results)