ขอบคุณสำหรับกระทู้นี้ - มันช่วยฉันได้มากเช่นกัน
ฉันเรียนรู้บางอย่างเกี่ยวกับ. join () วันนี้
เธรดเหล่านี้ทำงานแบบขนาน:
d.start()
t.start()
d.join()
t.join()
และสิ่งเหล่านี้ทำงานตามลำดับ (ไม่ใช่สิ่งที่ฉันต้องการ):
d.start()
d.join()
t.start()
t.join()
โดยเฉพาะอย่างยิ่งฉันพยายามฉลาดและเป็นระเบียบ:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
มันใช้งานได้! แต่มันทำงานตามลำดับ ฉันสามารถใส่ self.start () ใน __ init __ แต่ไม่ใช่ self.join () ที่จะต้องทำหลังจากเริ่มหัวข้อทั้งหมด
join () เป็นสาเหตุที่ทำให้เธรดหลักรอให้เธรดของคุณเสร็จสิ้น มิฉะนั้นเธรดของคุณจะทำงานเอง
ดังนั้นวิธีหนึ่งที่จะคิดว่า join () เป็น "hold" บนเธรดหลัก - เป็นการเรียงลำดับเธรดของคุณและดำเนินการตามลำดับในเธรดหลักก่อนที่เธรดหลักจะสามารถดำเนินต่อไปได้ เป็นการรับรองว่าเธรดของคุณเสร็จสมบูรณ์ก่อนที่เธรดหลักจะเลื่อนไปข้างหน้า โปรดทราบว่าสิ่งนี้หมายความว่ามันไม่เป็นไรถ้าเธรดของคุณเสร็จสิ้นแล้วก่อนที่คุณจะเรียกการเข้าร่วม () - เธรดหลักจะถูกปล่อยทันทีเมื่อเข้าร่วม ()
อันที่จริงตอนนี้มันเกิดขึ้นกับฉันแล้วที่เธรดหลักจะรอที่ d.join () จนกระทั่งเธรด d สิ้นสุดก่อนที่มันจะไปยัง t.join ()
ในความเป็นจริงเพื่อให้ชัดเจนพิจารณารหัสนี้:
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"
มันสร้างเอาท์พุทนี้ (โปรดทราบว่าคำสั่งพิมพ์เป็นเกลียวกัน)
$ 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 () กำลังถือเธรดหลัก เธรดทั้งสามเสร็จสมบูรณ์ก่อนที่ t1.join () จะเสร็จสิ้นและเธรดหลักจะดำเนินการพิมพ์ t2.join () จากนั้นพิมพ์ t3.join () จากนั้นพิมพ์
ยินดีต้อนรับการแก้ไข ฉันยังใหม่กับการทำเกลียว
(หมายเหตุ: ในกรณีที่คุณสนใจฉันกำลังเขียนรหัสสำหรับ DrinkBot และฉันต้องการเธรดเพื่อเรียกใช้ปั๊มผสมพร้อมกันแทนที่จะเรียงตามลำดับ - ใช้เวลาน้อยกว่าในการรอเครื่องดื่มแต่ละชนิด)