Bu konu için teşekkürler - bana da çok yardımcı oldu.
Bugün .join () hakkında bir şey öğrendim.
Bu iplikler paralel olarak çalışır:
d.start()
t.start()
d.join()
t.join()
ve bunlar sırayla çalışıyor (istediğim gibi değil):
d.start()
d.join()
t.start()
t.join()
Özellikle, akıllı ve düzenli olmaya çalışıyordum:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Bu çalışıyor! Ama sırayla çalışır. Self.start () 'ı __ init __' e koyabilirim, ancak self.join () 'i koyamıyorum. Bu daha sonra yapılmalı her iş parçacığı başlatıldıktan .
Join () ana iş parçacığının iş parçacığınızın bitmesini beklemesine neden olan şeydir. Aksi takdirde, iş parçacığınız kendi başına çalışır.
Join () 'i ana iş parçacığı üzerinde bir "bekletme" olarak düşünmenin bir yolu - ana iş parçacığı devam etmeden önce iş parçacığınızın iş parçacığını çözer ve ana iş parçacığında sırayla yürütülür. Ana iş parçacığı ilerlemeden önce iş parçacığınızın tamamlanmış olmasını sağlar. Join () çağrılmadan önce iş parçacığınız zaten bitmişse bunun bir sorun olmadığı anlamına geldiğini unutmayın - join () çağrıldığında ana iş parçacığı hemen serbest bırakılır.
Aslında, ana iş parçacığının t.join () 'e geçmeden önce d iş parçacığı bitene kadar d.join ()' de beklediğini şimdi anlıyorum.
Aslında, çok açık olmak gerekirse, şu kodu göz önünde bulundurun:
import threading
import time
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
def run(self):
print self.time, " seconds start!"
for i in range(0,self.time):
time.sleep(1)
print "1 sec of ", self.time
print self.time, " seconds finished!"
t1 = Kiki(3)
t2 = Kiki(2)
t3 = Kiki(1)
t1.join()
print "t1.join() finished"
t2.join()
print "t2.join() finished"
t3.join()
print "t3.join() finished"
Bu çıktıyı üretir (yazdırma ifadelerinin birbirine nasıl akıtıldığına dikkat edin.)
$ python test_thread.py
32 seconds start! seconds start!1
seconds start!
1 sec of 1
1 sec of 1 seconds finished!
21 sec of
3
1 sec of 3
1 sec of 2
2 seconds finished!
1 sec of 3
3 seconds finished!
t1.join() finished
t2.join() finished
t3.join() finished
$
T1.join () ana iş parçacığını tutuyor. Üç iş parçacığı da t1.join () bitmeden önce tamamlanır ve ana iş parçacığı, yazdırmayı yürütmek için ilerler ve ardından t2.join (), ardından t3.join () ve ardından yazdırır.
Düzeltmeler hoş geldiniz. Ayrıca iş parçacığı açma konusunda yeniyim.
(Not: İlgilenmeniz durumunda, bir DrinkBot için kod yazıyorum ve içerik pompalarını sırayla değil, eşzamanlı olarak çalıştırmak için iş parçacığı açmam gerekiyor - her bir içeceği beklemek için daha az zaman.)