2017-05-30 79 views
0

我下面布凱的Python tutorial在他線程的視頻,他得到這個輸出(不完全):Python的穿線不工作,因爲它應該工作

Send out messages 
Send out messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Send out messages 
Receive messages 
Receive messages 
Receive messages 

但是當我試着寫類似的代碼,我得到這樣的輸出:

Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Receiving messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 
Sending messages... 

這裏是我的代碼:

# threading 

import threading 

class Messenger(threading.Thread): 
    def run(self): 
     for _ in range(10): # '_' is used when you want to run a for loop but don't care about the varialble 
      print(threading.currentThread().getName()) 

x = Messenger(name='Sending messages...') 
y = Messenger(name='Receiving messages...') 

x.start() 
y.start() 

那麼,有沒有什麼wron g與我的代碼或這裏有什麼不對,以及爲什麼我的輸出與Bucky的輸出不同?

+0

我認爲這是因爲Python的gil(全局解釋器鎖定)屬性,即它一次只能執行一個線程https://docs.python.org/2/glossary.html#term-global-interpreter -lock –

+2

運行它不同的時間,我得到兩種輸出。它主要取決於操作系統何時爲線程分配時間。你可以添加一個小小的'sleep'來看看它發生的更慢 - 並且你會注意到你的每個線程執行的順序不能保證。這就是使用它們的重點:它們獨立運行。如果執行順序對您很重要,請勿使用線程或使用某種同步。 –

+0

@ThierryLathuille我測試了代碼9-10次,每次得到相同的輸出。我知道使用線程有什麼意義,這就是我使用它的原因。你對上面akhilviswam給出的'gil'觀點有什麼看法?如何禁用它? –

回答

0

使用線程時,不保證輸出順序。執行線程的順序取決於您的操作系統。我的系統上有完全不同的輸出。