Cảm ơn chủ đề này - nó cũng giúp tôi rất nhiều.
Tôi đã học được vài điều về .join () ngày hôm nay.
Các luồng này chạy song song:
d.start()
t.start()
d.join()
t.join()
và chúng chạy tuần tự (không phải những gì tôi muốn):
d.start()
d.join()
t.start()
t.join()
Cụ thể, tôi đã cố gắng khéo léo và gọn gàng:
class Kiki(threading.Thread):
def __init__(self, time):
super(Kiki, self).__init__()
self.time = time
self.start()
self.join()
Những công việc này! Nhưng nó chạy tuần tự. Tôi có thể đặt self.start () trong __ init __, nhưng không đặt self.join (). Điều đó phải được thực hiện sau khi tất cả các chủ đề đã được bắt đầu.
tham gia () là nguyên nhân khiến luồng chính chờ đợi luồng của bạn kết thúc. Nếu không, chủ đề của bạn chạy tất cả của chính nó.
Vì vậy, một cách để nghĩ về phép nối () là "giữ" trên luồng chính - đó là loại bỏ các luồng của luồng của bạn và thực hiện tuần tự trong luồng chính, trước khi luồng chính có thể tiếp tục. Nó đảm bảo rằng chủ đề của bạn đã hoàn thành trước khi chủ đề chính di chuyển về phía trước. Lưu ý rằng điều này có nghĩa là nó ổn nếu luồng của bạn đã kết thúc trước khi bạn gọi hàm jo () - luồng chính được giải phóng ngay lập tức khi tham gia () được gọi.
Trong thực tế, điều này xảy ra với tôi rằng luồng chính chờ ở d.join () cho đến khi luồng d kết thúc trước khi nó chuyển sang t.join ().
Trong thực tế, để rất rõ ràng, hãy xem xét mã này:
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"
Nó tạo ra kết quả đầu ra này (lưu ý cách các câu lệnh in được xâu vào nhau.)
$ 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 () đang giữ luồng chính. Tất cả ba luồng hoàn thành trước khi t1.join () kết thúc và luồng chính di chuyển để thực hiện in sau đó t2.join () sau đó in rồi t3.join () sau đó in.
Sửa chữa chào mừng. Tôi cũng mới bắt đầu xâu chuỗi.
(Lưu ý: trong trường hợp bạn quan tâm, tôi đang viết mã cho một DrinkBot và tôi cần xâu chuỗi để chạy các bơm thành phần đồng thời thay vì tuần tự - ít thời gian chờ đợi cho mỗi lần uống.)