Possiedo un'interoperabilità Python che dipende da multiprocessing
e pertanto non deve essere eseguita quando la patch di scimmia di Gevent è attiva. C'è una dichiarazione Python che può dirmi se gevent.monkey.patch_all
è stato eseguito o no?Come posso rilevare se la patch di scimmia di Gevent è attiva?
risposta
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"
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
Ciao Wes! Questa è una buona idea, ma accetterò l'altra risposta perché funziona a Gevent 0.13, mentre "salvato" è apparso in Gevent 1.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
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']
Grazie, è una bella aggiunta. –
solo un leggero suggerimento, il modo più divinatorio sarebbe: 'se socket.socket è gevent.socket' –
@WesMason Grazie, è buono. Dovrebbe essere 'se socket.socket è gevent.socket.socket' però. – Anorov