Python бағдарламалау тілінде паралельді есептеулер жүргізу
Жоланова Қарлығаш Бақтиярқызы
Л.Н. Гумилев атындағы Еуразия ұлттық университетінің «5В011100- Информатика» мамандығының студенті, Астана, Қазақстан
ХХІ ғасырдан келе жатқан параллель есептеулер күрделі және қол жетімсіз болатын. Python тілі мен қоса көптеген платформалар мен тілдер параллелизацияны жүзеге асыруға мүмкіндік береді.
Python көптеген тапсырмаларды орындауға арналған көптеген құралдарды ұсынады: көп дəрежелі, көп процедуралы. Қысқаша айтқанда, математикалық есептеулер үшін көп функциялы мультиқауіпсіздікті қолдануға болады.
Python + NumPy + Matplotlib байламы, ғылыми есептер мен алгоритмдердің жылдам прототипін жасау үшін ең тиімдісі. Бір циклде қарапайым дәйекті іздеуді қолдансаңыз, бұл шешім ұзақ уақыт бойы шешіледі. Көп ядролы процессорға ие болу осындай міндеттерді оңай параллелдеуге және күшті күшпен шешуге болады.
Python-да параллель есептеулерді жүзеге асыру үшін multiprocessing модульі қолданылады.Барлық процессорлық ядраларды жүктеу арқылы 5000,000-нан 6 000 000-ға дейінгі сандардағы қарапайым сандарды санау. Кәдімгі CPython жүйесіндегі GIL әдеттен тыс пішін үлгісін мүлдем тиімсіз етеді, өйткені біз параллель есептеулер үшін процестердің пулын стандартты мультипроцессорлық модульді қолданамыз.Workers саны таңдау - Егер оның саны аз болса, мәселе баяу шешіледі. үлкен сан болса жылдан шешіледі.Ол үшін алдымен worker- ге бөлнміз. Worker саны 6 немесе оданда көп worker-ке бөлуге болады. Тапсырма менеджері барлық процессорлық ядролардың 100% жуығын көрсетеді.
Питонда жіптер POSIX Сызбалары арқылы жүзеге асыры. Сондай-ақ, GIL (Global Interpreter Lock) - бұл жіптерде. Тарихи, аудармашының жаһандық кеңістікте деректер құрылымдары ең қауіпсіз емес. Сондықтан, әзірлеушілер бір мезгілде жұмыс істейтін ағындардың санын шектеуге шешім қабылдады. Яғни. сол уақытта ол GIL маркерді түсіреді тек бір жіп өңдеуге болады. Әрбір 100-дікте аудармашы құлыпты босатып, басқа бір ағынды орындауға мүмкіндік береді.
Осылайша, қазіргі уақытта python-дағы многопрограммаларды енгізу кезінде біз бір ғана жіпті тек бір ғана CPU-да орындауға болады. Өкінішке орай, python 3-ні C-shnoy-де іске асыру кезінде бәрі өзгеріссіз қалады.
Атап айтқанда, біздің жағдайда, сандардың диапазонын тең бөліктерге бөліп, әрқайсысы ауқымның басы мен аяғынан сұрай алады, содан кейін барлық Worker-лер берілген диапазондарда табылған қарапайым нөмірлерді қайтарып, оларды қосып, күте тұрыңыз. Дегенмен, жұмысты тең бөлікке бөлуге болмайды. Атап айтқанда, қарапайым сандарды іздегенде күрделілік суб-ауқымның бастапқы мәнімен айтарлықтай артады.
Соңғы уақытта бірнеше қиындықтармен бетпе-бет келгенде, бір жіпдегі тапсырма ең оңтайлы шешім емес. Мысалы, gui қосымшасында ауыр тапсырманы өңдеу кезінде, бағдарлама интерфейсі баяу жаңартылады, содан кейін орындалатын тапсырма үшін қосымша ағынды іске қосу пайдалы және gtk бағдарламасы сурет салу үшін жауап беретін өзекті ағыны қалдыруы керек, мысалы, прогресс жолағы. Басқа міндет xml-файлдар тобын талдау және дерекқорға нәтиже енгізу болды - әрқайсысы жекелеген файлдармен жұмыс істейтін бірнеше процесті іске қосу ыңғайлы.
Питонда параллелділікпен жұмыс істеу үшін, екі кіріктірілген модуль бар: 1.multiprocessing - бұл ағынды модульге ұқсас API пайдаланып, уылдырықтау үдерістерін қолдайтын пакет. Көптеген өңдеу пакеті жергілікті және қашықтағы параллельділікпен қамтамасыз етеді, жіптердің орнына субпроцесстерді пайдалану арқылы ғаламдық ауызша құлыптауды тиімді түрде қосады. Осыған байланысты, көп функциялы модуль бағдарламалаушыға берілген машинада бірнеше процессорды толығымен пайдалану мүмкіндігін береді. Ол Unix және Windows жүйелерінде жұмыс істейді.
Мультипроцессорлық модуль, сондай-ақ, ағынды модульде аналогтары жоқ API-ді енгізеді. Бұған ең қарапайым мысал болып табылады, ол көптеген кіріс мәндері бойынша функцияның орындалуын параллелдеудің ыңғайлы әдістерін ұсынады, бұл деректерді процестер (деректер параллелизмі) арқылы таратады. Төмендегі мысал модульдегі осындай функцияларды анықтаудың жалпы практикасын көрсетеді, сонда бала процестері осы модульді сәтті импорттай алады. (1-сурет)
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
нәтиже[1, 4, 9]
1-сурет
Көп функциялы процесте Процестің объектісін құру және оның start () әдісін шақыру арқылы процестер пайда болады. Процесс үрдістің API интерфейсіне сәйкес келеді.
Multiprocessing платформа түріне қарай, процесті бастаудың үш тәсілі бар. Бұл бастау әдістері
Ұрықтандыру процесі ол жаңа python аудармашы процесін бастайды. Бұл процесс объектілері run () әдісін іске қосу үшін қажетті ресурстарды ғана иеленеді. Атап айтқанда, ата-аналық процестің қажетсіз файлдық дескрипторлары мен тұтқалары қол жетімді болмайды. Бұл әдісті қолдана отырып процесті іске қосу форманың немесе форсунктың көмегімен жүзеге асады.
Unix және Windows жүйесінде қол жетімді.
Бұл процесс os.fork () тілін Python аудармашы үшін пайдаланады. Келесе процес басталса, алдыңғы процесіне тиімді болады. Ата-ананың барлық ресурстары бала процесі арқылы мұраға алады.
Бағдарлама басталған кезде және серверлерді бастау әдісін таңдайды, сервер процесі басталады. Содан кейін, жаңа процесс қажет болғанда, ата-ана процесі серверге қосылып, жаңа процесті жүргізуді сұрайды. Форк сервер процесі бірядролы, сондықтан os.fork () функциясын пайдалану қауіпсіз болып табылады. Қажет емес ресурстар мұра болып табылмайды
2. threading- Бұл модуль төменгі деңгейдегі _thread модулінің жоғары деңгейлі ағындық интерфейстерді құрастырады.
mydata = threading.local()
mydata.x = 1
Бұл модуль келесі функцияларды анықтайды:
Қазіргі уақытта тірі нысандардың санын қайтарыңыз. Қайтарылған санау тізіммен қайтарылған тізім ұзындығына тең.
Қоңырау шалушының басқару элементіне сәйкес келетін ағымдағы Thread нысанын қайтарыңыз. Егер қоңырау шалушы басқару элементі ағымдық модуль арқылы жасалмаса, шектеулі функционалдығы бар күлгін жіп нысаны қайтарылады.
Ағымдағы 'ағымдық идентификаторды' қайтарыңыз. Бұл нөлден тыс бүтін сан. Оның мәні тікелей мағынасы жоқ; ол пайдаланылатын сиқырлы куки ретінде қарастырылады, мысалы: ағынға тән деректердің сөздік индексін индекстеу. Туыстық идентификаторлар ағын пайда болғанда және басқа ағын пайда болғанда қайта өңделуі мүмкін.
Python бағдарламасында параллельді есептеуді қалай есептеуге болатындығы және онған мылсал келтірілген. Python бағдарламасында multiprocessing, threading көмегімен жоғары дәрежелі есептерді бірнеше Worker-ге бөлу арқылы уақытты үнемдеуге болатындығы айтылған.
Қолданылған әдебиеттер тізімі: Электрондық ресурс https://docs.python.org/3/library/threading.html
Электрондық ресурс https://docs.python.org/dev/library/multiprocessing.html
“Параллельные вычисления и многопоточное программирование “, Биллиг В.А, М.: НОУ "Интуит",2016-310c.
" Parallel Programming with Python ", jan palach, 2014с.