2012-03-02 28 views
15

tôi có mã này:Làm thế nào để sử dụng nhiều luồng

import thread 

def print_out(m1, m2): 
    print m1 
    print m2 
    print "\n" 

for num in range(0, 10): 
    thread.start_new_thread(print_out, ('a', 'b')) 

Tôi muốn tạo 10 chủ đề, mỗi chủ đề chạy chức năng print_out, nhưng tôi đã thất bại. Các lỗi như sau:

Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 
Unhandled exception in thread started by 
sys.excepthook is missing 
lost sys.stderr 

Trả lời

12

Trước hết, bạn nên sử dụng mức threading mô-đun cao hơn và đặc biệt là lớp Thread. Mô-đun thread không phải là những gì bạn cần.

Khi bạn mở rộng mã này, rất có thể bạn cũng sẽ muốn đợi các chuỗi kết thúc. Sau đây là một minh chứng về cách sử dụng phương pháp join để đạt được điều đó:

import threading 

class print_out(threading.Thread): 

    def __init__ (self, m1, m2): 
     threading.Thread.__init__(self) 
     self.m1 = m1 
     self.m2 = m2 

    def run(self): 
     print self.m1 
     print self.m2 
     print "\n" 

threads = [] 
for num in range(0, 10): 
    thread = print_out('a', 'b') 
    thread.start() 
    threads.append(thread) 

for thread in threads: 
    thread.join() 
+0

'thread.join()' được sử dụng để chờ cho đến khi chuỗi kết thúc. và tôi nhận thấy rằng nếu tôi không thêm hai dòng mã cuối cùng: 'cho thread trong thread: thread.join()', chương trình cũng chạy tốt, và mỗi thread được thực hiện tại 'thread.start()' theo debug , IOW nếu tôi không thêm 'time.time (0.1)', tôi không cần thêm mã 'thread.join()' vì chương trình sẽ tự động chờ thread để hoàn thành nhiệm vụ của nó tại 'thread.start()', phải không? – Searene

+0

@Mark Bạn không cần thêm 'time.sleep (0.1)' nào cả. Điều đó không cần thiết. Có, bạn có thể loại bỏ mã gọi 'join' và môi trường Python sẽ chờ tất cả các luồng hoàn thành trước khi chấm dứt thực hiện. Tuy nhiên, tôi đã thêm các cuộc gọi vào 'join' vì tôi hy vọng rằng bạn sẽ cần, tại một thời điểm nào đó trong tương lai, để biết cách đợi một luồng để hoàn thành việc thực hiện nó. Nhưng có, bạn có thể đơn giản bỏ qua những lời gọi đó để 'join' trong ví dụ đơn giản này. –

2

Bạn nên để cho các chủ đề chính ở lại sống một thời gian ngắn. Nếu chủ đề chính chết, tất cả các luồng khác và do đó bạn sẽ không thấy bất kỳ đầu ra nào. Thử thêm time.sleep(0.1) vào cuối mã và sau đó bạn sẽ thấy kết quả đầu ra.

Sau đó, bạn có thể xem thread.join() để biết thêm về điều này.

2

Cách tiếp cận khác là sử dụng lớp luồng.

instance[num]=threading.Thread(target=print_out, args=('a', 'b')) 

instance[num].start() 
Các vấn đề liên quan