Лабораториялық жұмыс 4. Ағындарды синхронизациялау құралдарын пайдалану.
Лабораториялық жұмыстың мақсаты: Студенттерде ағындарды синхронизациялау құралдарын таңдау және пайдалану дағдыларын қалыптастыру.
Лабораториялық жұмысты орындау нәтижесінде студенттер келесі қабілеттерге ие болады:
Есептің берілгеніне байланысты синхронизациялаудың құралын таңдау;
Синхронизациялау құралын пайдалану.
Тапсырма: Төменде берілген мысалдармен танысып, берілген тапсырмаларда ағындар арасында синхронизация орнату үшін екі синхронизациялау тәсілін таңдап, оларды пайдаланыңыз. Синхронизациялаудың екі тәсілін пайдалану нәтижелеріне баға беріңіз.
Жарысып ағындардың бір мезгілде орындалып кетуі - көп ағынды бағдарлама дұрыс жасалмаған кезде пайда болатын қате. Бұл бірнеше ағындар бірдей деректерге қол жеткізген кезде орын алады. Мысалы, айнымалы ағын1 және ағын2 бір уақытта өзгертуге тырысатын санды сақтайды, бұл болжау мүмкін емес нәтижелерге немесе қатеге әкеледі.Жалпы жағдай - бір ағын шарттың қандай да бір әрекетті орындау үшін айнымалы мәнін тексереді, бірақ шартты тексеру мен әрекетті орындау арасында екінші ағын араласады және айнымалы мәнді өзгертеді, нәтижесінде қате нәтижелер болады.
Жарыс жағдайлары әртүрлі мәселелерге әкелуі мүмкін :
Жадтың азаюы.
Деректер жоғалуы.
Бағдарлама қауіпсіздігінің осалдықтары.
Қате нәтижелер алу.
Өзара блоктау.
Жарыс жағдайын болдырмау үшін бірнеше ағындардың бір деректерде бірден жұмыс істеуіне жол бермейтін threading.Lock() функциясын пайдалану керек. Басқаша айтқанда, Lock деректерді бір уақытта қол жеткізуден қорғайды.threading.Lock() – объектіні қайтарады, яғни егер ағын Lock пайдаланса, онда басқа ағын Lock пайдаланған ағын оны блоктан шығарғанша күтуге мәжбүр болады.
Алынған нысанның екі әдісі бар: acquire() және release().
acquire()-блоктау
release()-блоктан шығару
range() функциясы оған берілген аргументтерге негізделген бүтін сандар тізбегін қайтарады. for циклдер көрсетілген жолдағы немесе range() функциясымен анықталған реттіліктегі барлық мәндер үшін код блогын қайталап орындатады.for циклі итерациялауға — нұсқаулар жинағын қажетті санда орындауға мүмкіндік береді . Ол қайталану саны алдын ала белгілі болған кезде қолданылады, сондықтан циклдің екінші аты алғы шартпен болады.
Есте сақтау керек тағы бір нәрсе, acquire() функциясына бірнеше рет қоңырау шалу мүмкін болса да, release() функциясына бірдей рет қоңырау шалу керек. Acquire() әрбір шақыруымен рекурсия деңгейі біреуге артады және әрбір босату() шақыруымен ол бір төмендейді.
Semaphore.Бұл информатика тарихындағы ең көне синхрондау құралдарының бірі. Семафор әрбір acquire() шақыруымен азайтылатын және әрбір release() шақыруымен өсетін ішкі есептегішті пайдаланады. Есептегіш нөлден кем бола алмайды; ол нөлге айналғанда acquire() ағынды блоктайды. Төмендегі мысал бағдарламада Semaphore үшін есептегіш 2 болғандықтан, t1 және t2 ағындары параллель орындалады және олардың орындалуы аяқталғаннан кейін басқа t3 және t4 ағындары іске қосылады.
1.Ағын кітапханасын шақырып алып, уақытты импорттаймыз. from threading, import time көмегімен 2.Lock() функциясын қолданамыз, l деп қысқа түрде атап көрсетіп аламыз l=Lock() 3.Атын және жасын қайтаратын функция енгіземіз. def wish(name,age) 4.for i in range(3) әр ағынды үш рет қайталауға береміз. 5.acquire(),release() көмегімен ағынды блоктаймыз және шығарамыз. 6.Ағынды құрып, мысал бойынша екі ағын құрылған соны орындауға жібереміз.
from threading import *
import time
l=Lock()
def wish(name,age):
for i in range(3):
l.acquire()
print("Сәлем",name)
time.sleep(2)
print("Сенің жасың",age)
l.release()
t1=Thread(target=wish, args=("Майра",15))
t2=Thread(target=wish, args=("Әлия",20))
t1.start()
t2.start()
from threading import *
import time
s=Semaphore(2)
def wish(name,age):
for i in range(3):
s.acquire()
print("Сәлем",name)
time.sleep(2)
s.release()
t1=Thread(target=wish, args=("Арман",15))
t2=Thread(target=wish, args=("Асхат",20))
t3=Thread(target=wish, args=("Шұғыла",16))
t4=Thread(target=wish, args=("Алтынай",25))
t1.start()
t2.start()
t3.start()
t4.start()
Тапсырма.
Әр студент көп ағынды программа құрып, ағынның сәйкессіздігін болдырмас үшін бұғаттауды қолданып Lock(),Semaphore әдістерін пайдаланатын екі мысал көрсетіп қорғаулары қажет.Мысалдар қайталанбаған болуы тиіс.