-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy paththread_2.py
221 lines (164 loc) · 5.53 KB
/
thread_2.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# -*- coding: utf-8 -*-
"""
Created on Fri Jan 29 01:02:04 2021
@author: Dogancan Torun
"""
#Bir cpuda kuyrukta ne kadar fazla eleamn varsa işlemden o kadar geç sonuç alırız.O andaki sistem yükü resp time için önemlidir
#Bir thread nasıl yaratılır:
#Bir thread threading sınıfının modülüyle yaratılır.
#thread.start() verilerek threadin akışı başlatılır
##iki threadli bir akış örneği:Main thread içerisinde 2. bir thread yaratıyorum
#ekran çıktısındaki tuhaflık threadlerin asenkron biçimde çalışması kaynaklıdır
import threading
import time
def thread_func():
for i in range(10):
print(f'new thread: {i}')
time.sleep(1) #thread_func threadini bir saniye durdurur diğer threadim çalışmaya devam eder
def main():
t = threading.Thread(target=thread_func) #thread yaratma şeklim
t.start() # t nesnemi start diyip çalıştırıyorum
for i in range(10):
print(f'main thread: {i}')
time.sleep(1) #main threadimi bir saniye durdurur diğer threadim çalışmaya devam eder
main()
#-------------------------------------------------------------
#Bir threade parametre geçirmek istersem;args içine tuple şeklinde yazımı verdim ve thread_fuc methoduna geçti
import threading
import time
def thread_func(msg):
for i in range(10):
print(f'{msg}: {i}')
time.sleep(1)
def main():
t = threading.Thread(target=thread_func, args=('new thread',)) #tuple aliyor arguman olarak
t.start()
for i in range(10):
print(f'main thread: {i}')
time.sleep(1)
main()
##bir threade aşağıdaki gibi iki tane parametre geçirmek istersem :
import threading
import time
def thread_func(msg, xxx):
for i in range(10):
print(f'{msg}: {i}')
time.sleep(1)
print('xxx', '=', xxx)
def main():
t = threading.Thread(target=thread_func, args=('new thread',), kwargs={'xxx': 100})
t.start()
for i in range(10):
print(f'main thread: {i}')
time.sleep(1)
main()
#aynı fonksiyonu birden fazla thread işletebilir.
#yerel değişkenler stackte yaratılır ve her threadin stacki farklıdır
import threading
import time
def foo(msg):
i = 0
while i < 10:
print(msg, '=>', i) #her thread yereldegiskenin farkli kopyasini olusturuyor
i += 1
time.sleep(1)
def thread_func():
foo('N')#her thread foo fonksiyonunu çağırıyor
def main():
t = threading.Thread(target=thread_func)
t.start()
foo('M')#her thread foo fonksiyonunu çağırıyor
main()
#threadlerde global değişken kullanma kuralı
##global degiskenler ortak
import threading
import time
i = 0 #her thread diğerinin arttırdığı i değişkenini alıp arttıryor yerel bir kopya yapmıyor
def foo(msg):
global i
while i < 10:
print(msg, '=>', i)
i += 1
time.sleep(1)
def thread_func():
foo('N')
def main():
t = threading.Thread(target=thread_func)
t.start()
foo('M')
main()
##Bir thread ne zaman biter? =>>pythonda tipik olarak bir thread bittiğinde sonlanır bir müdahale vs olmaz
#aşağıdaki örnekte bir thread çalışırken diğeri bekliyor.
import threading
import time
def thread_func():
for i in range(10):
print(i, end=' ')
time.sleep(1)
def main():
t = threading.Thread(target=thread_func)
t.start()
s = input('Adı Soyadı:')
print(s)
main()
#bir thread icindeki herhangi bir exception tüm programı çökertmez yalnızca o threadi sonlandırır.
import threading
import time
def thread_func():
for i in range(10):
print(f'new thread: {i}')
time.sleep(1)
if i == 5:
raise ValueError('Exception occurred!') #yalnızca bu thread sonlandırılır
#eğer main threadde exception olsaydı tüm programım patlardı
def main():
t = threading.Thread(target=thread_func)
t.start()
time.sleep(0.5)
for i in range(10):
print(f'Main thread: {i}')
time.sleep(1)
main()
#Bazı programlama dillerinde ana thread biterse program sonlanır.(C gibi)
#Bazı programlama dillerinde ana threadin bitmesiyle program sonlanmz ve son thread bitene kadar devam eder.(java,python)
import threading
import time
def thread_func():
for i in range(10):
print(f'new thread: {i}')
time.sleep(1)
def main():
t = threading.Thread(target=thread_func)
t.start()
print('main thread ends...') #ana thread bitti ama diğer threadimim çalışmaya devam etti
main()
#daemeon thread :ana thread daemeon thread değildir. Processin daemeon olmayan threadi sonlandığında iş biter
#is_alive:O anda o thread yaşıyor mu onu kontrol etmek için kullanılır.True false şeklinde toggle yapar
import threading
import time
def thread_func():
for i in range(10):
print(i, end=' ')
time.sleep(1)
def main():
t = threading.Thread(target=thread_func)
print(t.is_alive())
t.start()
print(t.is_alive())
input('Press ENTER to continue...')
print(t.is_alive())
main()
####
import threading
import time
def thread_func():
for i in range(10):
print(i, end=' ')
time.sleep(1)
def main():
t = threading.Thread(target=thread_func)
t.start()
t.join() #zaman verilmezse diğer threadler bitene kadar main thread bekler. hepsi bitince ok der geçer t.join(x) x saniye bekliyor
#♦t.join(4) 4 saniyeye kadar diğeri bitmezse main thread kladığı yerden devam eder.
print('Ok')
main()