2014-07-16 39 views

回答

15

我不知道有一個慣用的方式,但一個簡單的方法是檢查socket.socket類:

import gevent.monkey, gevent.socket 
gevent.monkey.patch_all() 
import socket 

if socket.socket is gevent.socket.socket: 
    print "gevent monkey patch has occurred" 
+1

只是一個輕微的建議,更Python的方式應該是:'如果socket.socket是gevent.socket' –

+1

@WesMason謝謝,那很好。不過,它必須是'如果socket.socket是gevent.socket.socket'。 – Anorov

9

據我所知,當一個項目被修補的gevent.monkey.saved字典只更新,和原來的被放置在字典中(並且在未修補時被移除),例如

>>> from gevent.monkey import saved 
>>> 'sys' in saved 
True 
+1

嗨,韋斯!這是一個好主意,但我會接受其他答案,因爲它可以回到Gevent 0.13,而「保存」出現在Gevent 1.0中。 –

+0

通過運行'monkey.patch_all()'後查看'monkey.saved.keys()',我不認爲''sys''鍵在它裏面。這不是檢測猴子修補的有效方法。 – Rockallite

3

以下是我用於檢測gevent猴子修補程序是否處於活動狀態。

def is_gevent_monkey_patched(): 
    try: 
     from gevent import monkey 
    except ImportError: 
     return False 
    else: 
     return bool(monkey.saved) 

如前所述A. Jesse Jiryu Davis,這適用於僅GEVENT 1.0.x的。

更新:在gevent 1.1有an support API這有助於知道對象是否已被猴子修補。因此,對於GEVENT 1.1的答案可能是:

def is_gevent_monkey_patched(): 
    try: 
     from gevent import monkey 
    except ImportError: 
     return False 
    else: 
     return monkey.is_module_patched('__builtin__') 

BTW,我發現monkey.is_module_patched('sys')總是返回False。通過觀察monkey.saved.keys()運行monkey.patch_all()後,我認爲只有以下模塊是有效的檢查:

['_threading_local', '_gevent_saved_patch_all', 'socket', 'thread', 'ssl', 
'signal', '__builtin__', 'subprocess', 'threading', 'time', 'os', 'select'] 
+0

謝謝,這是一個很好的補充。 –

相關問題