2016-09-16 43 views
1

在工作中,我們使用gevent創建一些異步服務器,並且有關何時執行與其他模塊相關的猴子修補的一些爭論。 gevent文檔顯示如下:gevent monkey修補訂單

from gevent import monkey 
monkey.patch_socket() 
import socket 

其中,在導入庫模塊之前進行了猴子修補。

然而,我的經理覺得猴子打補丁的順序應該是這樣的:

import socket 
from gevent import monkey 
monkey.patch_socket() 

凡庫模塊導入後,猴子修補被調用。這使得它看起來像猴子補丁看到套接字模塊已被導入,並在那一點上補丁。

我發現了一些討論,說這樣做的一種方式,和其他人說,做到另一個。我自己的簡單測試似乎說這沒關係。有沒有人有這個意見,有一些明確的原因,或爲什麼會說的引用?

在此先感謝! Doug

回答

0

那麼,根據源代碼(見下文)patch_socket調用patch_module,它會爲你導入socket模塊。

def patch_module(name, items=None): 
    gevent_module = getattr(__import__('gevent.' + name), name) 
    module_name = getattr(gevent_module, '__target__', name) 
    module = __import__(module_name) 
    if items is None: 
     items = getattr(gevent_module, '__implements__', None) 
     if items is None: 
      raise AttributeError('%r does not have __implements__' % gevent_module) 
    for attr in items: 
     patch_item(module, attr, getattr(gevent_module, attr)) 
    return module 

看到在GitHub上的gevent存儲庫。

所以,你根本不需要導入套接字(除非你使用它)。

1

作爲GEVENT的當前維護者,我將指向the documentation特異性說(multiple times)所建議的方式來猴的貼劑是儘早,優選之前任何其他進口做

現在,使用大多數標準庫模塊,您可以在導入後用猴子修補程序逃脫。但是第三方庫不一定就是這樣安全的。一般來說,這樣更安全,並且可以儘快減少麻煩。

+0

感謝您提供的「顛倒頭部」,我已經閱讀了幾次文檔,並且因爲我在網絡中看到的例子而感到困惑。應該相信文檔。 :) –

+0

嗨Jason, 請澄清有什麼問題 (Python 3.5.2在Linux上) ** from gevent.monkey import patch_all; is_module_patched; patch_all();導入套接字is_module_patched(socket)** => _ False_ – dvska

+1

'is_module_patched(modname)'需要一個模塊*名稱*而不是模塊本身。 –