Threading модуліні функциясы
Осында олданылатын threading модулінде аындар жайлы апаратты алуа мміндік беретін функциялар бар:
· activeCount(). азіргі уаытта Thread классыны данасыны белсенді санын айтарады.Наты трде, бл len(threading.enumerate()).
· currentThread(). Аымдаы обьект-аынын айтарады, яни осы функцияны шаыран, басару аынына сйкес. Егер аын threading модуль арылы рылмаса, ысартылан функционалдылы(dummy thread object) обьект-аынымен айтарылатын болады.
· enumerate(). Белсенді аындар тізімін айтарады. Аяталан жне лі басталмаан аындар тізімге кірмейді.
Thread классы
threading.Thread классыны даналары Python-бадарламасыны аындарын сынады. Аында орындалатын рекеттерді екі тсілмен беруге болады: орындалатын обьект классыны конструкторын жіберу жне оан аргументтер немесе мралану кмегімен аныталан run() дісімен берілген жаа класс алу. Бірінші тсіл жоарыдаы мысалда арастырылан. threading.Thread класс конструкторы келесідей аргументтерге ие:
Thread(group, target, name, args, kwargs)
Мндаы group – аындар жиынтыы (зірге олданылмайды, None те болу керек), target - run() дісінде шаырылатын обьект, name – аын атауы, args жне kwargs – target обьекті параметрінде берілгендерді шаыру шін позициялы жне аттаулы параметрлерді (сйкесінше) тізбектілігі жне сздігі. Жоарыда келтірілген мысалда тек позициялы параметрлер олданылан, біра дл солай аттаулар параметрін олдануменде орындауа болатын еді:
import threading
def proc(n):
print "Процесс", n
p1 = threading.Thread(target=proc, name="t1", kwargs={"n": "1"})
p2 = threading.Thread(target=proc, name="t2", kwargs={"n": "2"})
p1.start()
p2.start()
Дл солай threading классынан мрагерлік арылы жасауа болады. Жекеменшік конструкторын жне run() дісіні аныталуымен берілген Thread:
import threading
class T(threading.Thread):
def __init__(self, n):
threading.Thread.__init__(self, name="t" + n)
self.n = n
def run(self):
print "Процесс", self.n
p1 = T("1")
p2 = T("2")
p1.start()
p2.start()
Е бірінші конструкторда жасау ажет – базалы классты конструкторын шаыру. Брыныдай аынды іске осу шін, run() дісінде рекетті орындалуына келетін, обьект-аыныны start() дісін орындау ажет.
мірлік аындарды келесі дістер арылы шаыра отырып басаруа болады:
· start(). Аына мір береді.
· run(). Бл діс аында орындалуа тиіс рекеттерді сынады.
· join([timeout]). Осы аынды шаыратын аын шаырылан діс бойынша аынны аяталуын кте отырып тотатылады. timeout параметрі (жылжымалы нктемен берілген сан) кту уаытын крсетуге ммкіндік береді (секундпен), жарамдылыы біткен со, айсыбір join дісі шаырылан, аынны аяталуына арамастан тотатылан аын з жмысын жаластырады. Кейбір аынны join() кп рет шаыруа болады. Аын з-зін шаыра алмайды. Жнеде лі іске осылмаан аынны аяталуын ктуге болмайды. "join" сзін аылшыншадан аударан кезде байланыстыру деген маынаа ие, яни join() шаырушы діс, аын аяталан со аынды шаыру дісіне байланысанын алайды.
· getName(). Аын атауын айтарады. Басты аын шін бл "MainThread".
· setName(name). Аына name атауын меншіктейді.
· isAlive(). Егер аын жмыс істесе, аиатын айтарады (run() дісі шаырылан, біра лі аяталмады).
· isDaemon(). Егер аын домен белгісіне ие болса, аиатты айтарады. Python-даы бадарлама, демон болып табылмайтын, барлы аындарды аяталуы бойынша аяталады. Негізгі аын демон болып табылмайды.
· setDaemon(daemonic). Аын демон болып табылады деген daemonic белгісін орнатады. Бл белгіні бастапы мні мліметтерді жіберген аыннан алынады.
Thread модулінде зірге Java-да аына тн ммкіндіктер іске аспаан (аындар топтарын анытау, тотату жне сырты аындарды зілуі, басыылы жне кейбір баса нрселер), дегенмен олар келер жылда рылады.
Таймер
threading.Timer классы берілген уаыт арылы орындалуы керек рекеттерін сынады. Бл класс threading.Thread классыны ішкі классы болып табылады, сондытан start() дісіменде іске осылады. Келесі стандартты шыаруда Hello, world! басатын арапайым мысалда айтыландарды тсіндіреді:
def hello():
print "Hello, world!"
t = Timer(30.0, hello)
t.start()
Лыптар
арапайым лып threading модуліні Lock классы негізінде іске асуы ммкін. лып екі кйге ие: ол ашы труы немесе жабы труы ммкін. Соы жадайда олара кейбір аындар иелік етеді. Lock классыны обьекті келесідей дістерге ие:
· acquire([blocking=True]). лыпты лыптауа сраныс жасайды. Егер blocking параметрі крсетілмесе немесе аиат болып табылса, онда аын лыпты босауын ктетін болады. Егер параметр берілмесе, онда діс мнді айтармайды. Егер blocking берілген болса жне аиат болса, онда діс True айтарады (лыпты стті мегергеннен кейін). Егер лыпталу ажет болмаса (яни blocking=False берілген), діс True айтарады, егер лып жабылмаса жне олармен осы аын стті мегерген. Кері жадайда False айтарылатын болады.
· release(). лыпты ашу шін срау.
· locked(). лыпты аындаы кйін айтарады (True - жабы, False - ашы).
Ескеру керек, тіпті егер лып кйі жаа ана зілген болсада, ол бл кйді келесі командаа дейін сатайды дегенді білдірмейді.
лыпты, threading.Lock-тен кейбір аын оны лыпталуын кп рет срайтындыымен ерекшеленетін, таы бір нсасы бар - threading.Rlock. Бндай лыпты лыптау анша лыпталу болды, сонша рет болуы керек. Бл тиімді болуы ммкін мысалы, рекурсивті функциялар ішінде.