Terima kasih atas utas ini - ini banyak membantu saya.
Saya belajar sesuatu tentang .join () hari ini.
Utas ini berjalan secara paralel:
d.start()
t.start()
d.join()
t.join()
dan ini berjalan secara berurutan (bukan yang saya inginkan):
d.start()
d.join()
t.start()
t.join()
Secara khusus, saya mencoba untuk pintar dan rapi:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Ini bekerja! Tapi itu berjalan berurutan. Saya bisa meletakkan self.start () di __ init __, tetapi bukan self.join (). Itu harus dilakukan setelah setiap utas dimulai.
join () adalah apa yang menyebabkan utas utama menunggu utas Anda selesai. Jika tidak, utas Anda berjalan dengan sendirinya.
Jadi salah satu cara untuk menganggap join () sebagai "tahan" pada utas utama - itu semacam mencabut utas dan menjalankan secara berurutan pada utas utama, sebelum utas utama dapat dilanjutkan. Ini memastikan bahwa utas Anda selesai sebelum utas utama bergerak maju. Perhatikan bahwa ini berarti tidak apa-apa jika utas Anda sudah selesai sebelum Anda memanggil join () - utas utama dilepaskan segera saat join () dipanggil.
Sebenarnya, barusan saya sadar bahwa utas utama menunggu di d.join () hingga utas d selesai sebelum beralih ke t.join ().
Bahkan, agar sangat jelas, pertimbangkan kode ini:
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"
Ini menghasilkan output ini (perhatikan bagaimana pernyataan cetak saling berulir.)
$ 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 () sedang memegang utas utama. Ketiga utas selesai sebelum t1.join () selesai dan utas utama melanjutkan untuk menjalankan cetak kemudian t2.join () kemudian cetak lalu t3.join () lalu cetak.
Selamat datang koreksi. Saya juga baru mengenal threading.
(Catatan: jika Anda tertarik, saya menulis kode untuk DrinkBot, dan saya perlu threading untuk menjalankan pompa bahan secara bersamaan daripada berurutan - lebih sedikit waktu untuk menunggu setiap minuman.)