Python dərs 8- Paralel proqramlaşdırma
Pythonda paralel proqramlaşdırma üçün bir çox üsul var. Ən çox işlənilən Python ilə qurulan built-in modullar olan threading, multiprocessing, subprocess ilə yanaşı MPI4PY, pyMPI kimi modullar da var.
Multithread proqramlaşdırma nədir? Multithread proqramlaşdırma yəni çox kanallı proqramlaşdırmadır. Belə ki normal yazılan proqramlarda əməliyyatlar ardıcıl gedir bir əməliyyat bitdikdən sonra digəri davam edir və bütün əməliyyatlar bir thread üzərində gedir, multithread proqramlaşdırmada isə görülən iş bir neçə threadə ayrılır hər bir əməliyyat fərqli threadlərdə işləyir, hətta bir əməliyyat belə parçalara ayrılaraq fərqli threadlərdə işləyir. Thread bir process-in (əməliyyatın) üzərində eyni vaxtda birdən çox iş görmək imkanı yaradır. Belə başa düşmək olar ki bir işi bir işçi yox birdən çox sayda işçi tərəfindən yerinə yetirilməsini təmin edir. Hər bir thread bir processə malikdir və bir process içində birdən çox thread ola bilər. Process yaddaşda hər hansı bir yer tutur və bir çox thread yaddaşdakı bu eyni yerdə eyni zamanda əməliyyat apara bilir. Paralel və ya Multithread proqramlaşdırmanın məntiqini başa düşdükdən sonra Pythonda onun necə işləməsinə baxaq. İlk olaraq threading modulundan istifadə edərək bir neçə kod nümunəsinə baxaq.
import threading #threading modulunu daxil edirik
def test1(a): #test1 metodu
print(“test1”)
def test2(b): #test2 metodu
print(“test2”)
t1 = threading.Thread(target=test1, args=(5,)) #t1 thread yaratdıq
t2 = threading.Thread(target=test2, args=(5,)) #t2 thread yaratdıq
# t1 threadini çalışdırdıq
t1.start()
# t2 threadini çalışdırdıq
t2.start()
print(“Bitdi”)
result:
test1
test2
Bitdi
Yuxarıdakı nümunədə 2 dənə test metodu yazdıq və onları çalışdıran iki dənə t1 və t2 threadləri yaratdıq. Sonra bu threadləri çalışdırdıq və nəticədə hər iki metodumuz eyni vaxtda çalışdı. Bu nümunədə o qədər də aydın olmaya bilər. Ona görə də başqa bir kod nümunəsinə baxaq.
import threading #threading modulunu daxil edirik
def test1(a): #test1 metodu
print(“test1”)
def test2(a): #test2 metodu
for i in range(100000):
a+=i
print(“test2”)
t1 = threading.Thread(target=test1, args=(5,)) #t1 thread yaratdıq
t2 = threading.Thread(target=test2, args=(5,)) #t2 thread yaratdıq
# t1 threadini çalışdırdıq
t1.start()
# t2 threadini çalışdırdıq
t2.start()
print(“Bitdi”)
result:
test1
Bitdi
test2
Bu kodda biz eyni şəkildə iki metodumuz çalışdıran iki thread yaradırıq. Ancaq ikinci metodu daha çox əməliyyat aparacaq şəkildə yaratdıq. Nəticədə test1 metodu və test2 metodu eyni vaxta çalışmağa başlasada test2 metodu uzun vaxt tələb edən əməliyyat apardığı üçün test2 yazısını ekrana en sonda yazır. Bir thread daha əlavə edək.
import threading #threading modulunu daxil edirik
def test1(a): #test1 metodu
print(“test1”)
def test2(a): #test2 metodu
for i in range(100000):
a+=i
print(“test2”)
def test3(a): #test1 metodu
print(“test3”)
t1 = threading.Thread(target=test1, args=(5,)) #t1 thread yaratdıq
t2 = threading.Thread(target=test2, args=(5,)) #t2 thread yaratdıq
t3 = threading.Thread(target=test3, args=(5,)) #t2 thread yaratdıq
# t1 threadini çalışdırdıq
t1.start()
# t2 threadini çalışdırdıq
t2.start()
# t3 threadini çalışdırdıq
t3.start()
print(“Bitdi”)
result:
test1
test3
test2
Bitdi
Tutaq ki indi biz istiyirik ki t1 və t2 threadləri çalışdıqdan sonra t3 thread-i çalışsın. Onda kodumuzu bu şəkildə dəyişdirə bilərik.
import threading #threading modulunu daxil edirik
def test1(a): #test1 metodu
print(“test1”)
def test2(a): #test2 metodu
for i in range(100000):
a+=i
print(“test2”)
def test3(a): #test1 metodu
print(“test3”)
t1 = threading.Thread(target=test1, args=(5,)) #t1 thread yaratdıq
t2 = threading.Thread(target=test2, args=(5,)) #t2 thread yaratdıq
t3 = threading.Thread(target=test3, args=(5,)) #t2 thread yaratdıq
# t1 threadini çalışdırdıq
t1.start()
# t2 threadini çalışdırdıq
t2.start()
t1.join()
t2.join()
# t3 threadini çalışdırdıq
t3.start()
print(“Bitdi”)
Bu halda t1.join() t2.join() yazmaqla t1 və t2 threadlərinin işləyib bitməsini gözləyir. Daha sonra kod normal axışı ilə davam edir.
Ardı olacaq…