2013-05-31 50 views
1
def start(self): 
    self.running = True 
    while self.running: 
     pass 

def shut_down(self): 
    self.running = False 

嗨我想知道一個好方法,同步變量運行。我想有快速的解決方案,但我不知道什麼是更好的信號量,互斥鎖或鎖。我認爲shut_down不常用。可變環路和同步

這是我最好的解決方案,但我認爲我們可以做得更好。

def start(self): 
    self.__lock__.acquire() 
    self.running = True 
    while self.running: 
     self.__lock__.release() 
     self.__lock__.acquire() 

def shut_down(self): 
    self.__lock__.acquire() 
    self.running = False 
    self.__lock__.release() 

回答

1

爲了您與像布爾標誌一個原始值簡單的例子,不需要同步在Python。至少,不在CPython中(可以從python.org下載標準解釋器)。

這是因爲整個解釋器被「全局解釋器鎖」所覆蓋,所以在Python級別一次只能運行一個線程(多個線程可能同時在擴展模塊中執行某些操作,如果這些線程模塊設置爲在適當的時候釋放GIL)。因此,當您的工作線程在start函數中循環時檢查running屬性,可以確保該對象處於健全狀態。如果除了shut_down之外的其他代碼修改它,您甚至可以確定它將是TrueFalse。因此,如果您打算使用CPython並且堅持使用非常簡單的邏輯(比如只有一個線程寫入的布爾標誌),那麼您的第一個示例代碼就可以正常工作。

如果您需要更復雜的邏輯,如可以通過多個線程中的任何一個線程遞增的計數器,那麼您需要一些同步以避免競爭條件,如TOCTTOU

Python提供的最簡單的同步工具之一是the queue module,它允許以FIFO的方式在線程之間進行同步通信。與低級別的東西相比,我不能說它的性能,但是讓代碼正確地與隊列一起工作是非常容易的(但是它很容易搞亂手動鎖定,最終導致死鎖或競態條件成爲調試的噩夢) 。

+0

我想寫我自己的迷你服務器與多個客戶端。多處理或線程女巫會更好? – Luffy

+0

@Luffy這取決於你最終會等到什麼。如果您的服務器正在運行CPU密集型任務,那麼您將需要執行多處理,因爲它允許Python同時使用多個CPU /內核。另一方面,如果大多數服務器遇到的延遲都與I/O有關(從磁盤讀取文件,通過網絡發送/接收東西),多線程可能已經足夠了。我懷疑多線程的開銷和同步成本較低,但如果您不確定,我會測試各種解決方案。 – Blckknght

+0

好的建議。首先,我會嘗試使用線程。 – Luffy