2014-07-16 11 views

Antwort

15

Ich bin nicht sicher, ob es ein idiomatischer Weg, aber eine einfache Möglichkeit wäre, die socket.socket Klasse zu überprüfen:

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

nur einen leichten Vorschlag, der mehr pythonic Weg wäre: 'wenn socket.socket gevent.socket' ist –

+1

@WesMason Danke, das ist gut. Es müsste sein, wenn socket.socket gevent.socket.socket ist. – Anorov

9

afaik die gevent.monkey.saved dict nur aktualisiert werden, wenn ein Element gepatcht ist, und das Original wird innerhalb des Diktats platziert (und bei Nichtübereinstimmung entfernt), z

+1

Hallo Wes! Das ist eine gute Idee, aber ich werde die andere Antwort akzeptieren, weil sie auf Gevent 0.13 zurückgeht, während in Gevent 1.0 "gespeichert" erscheint. –

+0

Wenn ich in 'monkey.saved.keys()' nach der Ausführung von 'monkey.patch_all()' nachschaue, denke ich nicht, dass der Schlüssel "sys" drin ist. Dies ist keine gültige Methode, um Affepatching zu erkennen. – Rockallite

3

Hier ist, was ich verwendet habe, um festzustellen, ob gevent Affe Patching aktiv ist.

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

Wie A. Jesse Jiryu Davis erwähnt, funktioniert dies nur GEVENT 1.0.x.

Aktualisiert: in gevent 1.1 gibt es an support API das ist hilfreich zu wissen, ob Objekte Affe-Patched wurden. So ist die Antwort für GEVENT 1.1 könnte sein:

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

BTW, finde ich, dass monkey.is_module_patched('sys') immer False zurückgibt. Mit einem Blick in monkey.saved.keys() nach monkey.patch_all() läuft, denke ich nur die folgenden Module gültig sind zu überprüfen:

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

Danke, das ist eine nette Ergänzung. –

Verwandte Themen