Python dərs 8- Paralel proqramlaşdırma

Hasan Jafarov
3 min readMar 14, 2020

--

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…

--

--

No responses yet