2016-12-19 68 views
6

的故事:必要性關閉ASYNCIO事件循環明確

目前我正在通過asyncio basic examples,尤其是this one - 儘可能簡單的HTTP客戶端。如果我省略了loop.close()

def main(): 
    loop = get_event_loop() 
    try: 
     body = loop.run_until_complete(fetch()) 
    finally: 
     loop.close() 
    print(body.decode('latin-1'), end='') 

但是,代碼也適用:

def main(): 
    loop = get_event_loop() 
    body = loop.run_until_complete(fetch()) 
    print(body.decode('latin-1'), end='') 

問題的主要功能啓動一個事件循環,運行,直到數據抓取完畢並關閉事件循環:

雖然有一個例子,但問題是一個通用的問題 - 如果忘記關閉asyncio事件循環,可能會出現什麼問題?事件循環是否始終隱式關閉?

+1

你會泄漏資源。 –

+0

您認爲隱含關閉它是什麼?我認爲當程序結束時你只能依賴垃圾回收,在程序結束之前你的程序運行了多長時間才能完成事件循環? –

+0

@FilipHaglund謝謝。你能想出一種方法來測試/證明這一點嗎? – alecxe

回答

3

.close()可以被不同的事件循環實現用來釋放由循環分配的系統資源(或者做其他事情)。如果你在_UnixSelectorEventLoop的代碼,這是在Linux中使用的(默認)IOLoop看一看,你會發現下面的代碼:

def close(self): 
    super().close() 
    for sig in list(self._signal_handlers): 
     self.remove_signal_handler(sig) 

這裏,例如,close()刪除與loop.add_signal_handler()註冊信號處理程序。由於多個IOLoops可以在不同的線程上啓動,或者在舊的IOLoops關閉後可以創建新的IOLoops(請參閱asyncio.new_event_loop()),關閉它們應該被認爲是一個好習慣。