-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy paththread_intro.py
131 lines (94 loc) · 4.3 KB
/
thread_intro.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 23 20:40:44 2021
@author: doğancan torun
"""
#Threadlerle çalışma:
#bir programda farklı akışlar yaratmak istersem threadleri kullanıyorum
#bir programın farklı iki akışı olsun veya yeni akışlarla kordineli işlemler yapsın istersem thread kullanıyorum
#Her program bir threadle başlar diğer tüm threadleri biz yaratırız.
#------------------------
import time
import threading
def foo():
for i in range(10):
print('other thread: {}'.format(i))
time.sleep(1)
def main():
for i in range(10):
print('main thread: {}'.format(i))
time.sleep(1)
thread = threading.Thread(target=foo) #yeni threadler thread sınıfıyla yaratılıyor
thread.start() #threadimi start methodumla başlatıyorum
main() #main thread program başladğında çalışan threadim bu akışta 2 thread çalıştı
###3 farklı thread çalıştırmak istersem
import time
import threading
def foo():
for i in range(10):
print('1.thread: {}'.format(i))
time.sleep(1)
def bar():
for i in range(10):
print('2.thread: {}'.format(i))
time.sleep(1)
def main():
for i in range(10):
print('main thread: {}'.format(i))
time.sleep(1)
thread1 = threading.Thread(target=foo)
thread1.start()
thread2 = threading.Thread(target=bar)
thread2.start()
main()
###################### TEORİK ANLATIM ##################
#Bir process akış bakımından threadlerden oluşuyor
#Thread yapısı 90 larda başlamıştır.Threadden önce çalışma zaman paylaşımlı yapmaktadır
#Zaman paylaşımlı işleme methodu :cpu da bir thread çalışıyor , yarıda bırakıp diğeri başlıyor.
#işletim sistemleri çalıştıracağı threadleri "runqueeue" da biriktirir.ve schedule olarak çalıştırır.
##Threadlere neden gereksinim duyulur##
#1)periyodik arka plan işlemleri yapmak için
#2)bir programı hızlandırmak için;
#Concurrency:Akışların beraber işleme alınmasına denir.Alt başlıkları aşağıdaki gibidir
#Multithread programming:Concurrency alt başlığında bulunur.Programı threadlere ayırarak çalışmasını sağlar
#Disturbited programming:Bir işi birden fazla bilgisayara bir network aracılığıyla dağıtarak yapma işlemi.
#Parallel programming:Aynı makina içerisinde threadler oluşturup corelara bilinçli şekilde atayıp çalıştırma işlemine denir
#Not:Pythonda global programlama yok iken python kütüphanelerinden keras vs de paralel programlama kullanılır. Kerasta kodun içinde C kodu koşturulur.
#3)Blokeli IO işlemleri için kullanılır;
#Server-Client IO uygulamalarında multithreading yapı kullanılır.
#4)Bazı GUI programlarda kullanılıyor
#--- #Tkinter thread kullanım örneği;
#GUI programlarda herhangi bir işlemin messagequeda uzun süre kalmasını istemediğimizde threadleri kullanırız
import threading
import tkinter as tk
import tkinter.messagebox
import threading
import time
class GUI:
def __init__(self, master):
master.geometry('400x350')
master.title('Sample Data Binding')
self.master = master
self.button_start = tk.Button(master, text='Çalıştır', command=self.button_start_handler)
self.button_start.place(x=100, y=10, width=70, height=70)
self.button_stop = tk.Button(master, text='Stop', command=self.button_stop_handler)
self.button_stop.place(x=200, y=10, width=70, height=70)
def do_something(self): #yapmak istediğim işlemi do_something icerisinde yazıyorum ve mesaj döngüsünde kalıyorum
for i in range(100):
if self.flag:
break
print(i)
time.sleep(1)
def button_start_handler(self):
"""
thread yaratıyoruz ve işlemi threade yaptırıp program akışımıza kaldığımız yerden devam ediyoruz
akışımız bu şekilde ilerliyor
"""
self.flag = False
self.thread = threading.Thread(target=self.do_something) #butona bastığımda bir thread yaratıyorum
self.thread.start() #threadi çalıştırıyorum
def button_stop_handler(self):
self.flag = True
root = tk.Tk()
gdb = GUI(root)
root.mainloop()