2014-05-20 65 views
0

此代碼是否具有競爭條件或競爭條件只發生在協同程序中? 我如何解決這種競爭條件,最好不使用庫?這裏是否存在競爭條件以及如何處理?

class Handler(WebSocketHandler): 
    listeners = {} 

    def open(self, sub): 
     self.subscriptions = [sub] 
     Handler.listeners.setdefault(sub, set()).add(self) 

    def on_close(self): 
     for sub in self.subscriptions: 
      Handler.listeners[sub].remove(self) 
      if not Handler.listeners[sub]: 
       # here in between someone might subscribe 
       # so we delete non empty set! which is wrong 
       del Handler.listeners[sub] 

回答

2

沒有比賽條件;龍捲風應用程序通常是單線程的。除非你自己明確地啓動了任何線程,否則只有主線程在你的應用程序中運行。因此,在檢查not Handler.listeners[sub]和執行del之間不能中斷您的代碼。

即使你使用了協程,類似你的代碼仍然沒有比賽。協程不能被中斷,除非它執行yield語句。這是協程的最佳特性之一。他認爲明確的異步編程(帶回調或yield語句)優於多線程,因爲在異步編程中競態條件更容易發現。