2014-07-16 12 views

risposta

15

io non sono sicuro che ci sia un modo idiomatico, ma un modo semplice sarebbe quello di controllare la classe 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

solo un leggero suggerimento, il modo più divinatorio sarebbe: 'se socket.socket è gevent.socket' –

+1

@WesMason Grazie, è buono. Dovrebbe essere 'se socket.socket è gevent.socket.socket' però. – Anorov

9

afaik il gevent.monkey.saved dict viene aggiornata solo quando un elemento è patchato, e l'originale è posto all'interno del dict (e rimosso su unpatching), ad es

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

Ciao Wes! Questa è una buona idea, ma accetterò l'altra risposta perché funziona a Gevent 0.13, mentre "salvato" è apparso in Gevent 1.0. –

+0

Guardando in 'monkey.saved.keys()' dopo aver eseguito 'monkey.patch_all()', non penso che la chiave '" sys "' sia in essa. Questo non è un modo valido per rilevare le patch delle scimmie. – Rockallite

3

Ecco quello che ho usato per rilevare se gevent scimmia patch è attiva.

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

Come A. Jesse Jiryu Davis accennato, questo funziona solo per 1.0.x gevent.

Aggiornato: in gevent 1.1 c'è an support API che è utile sapere se gli oggetti sono stati scimmia-patched. Quindi la risposta per gevent 1.1 potrebbe essere:

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

proposito, trovo che monkey.is_module_patched('sys') restituisce sempre False. Guardando in monkey.saved.keys() dopo l'esecuzione monkey.patch_all(), credo che solo i seguenti moduli sono validi per controllare:

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

Grazie, è una bella aggiunta. –

Problemi correlati