2016-09-16 4 views
1

Bei der Arbeit verwenden wir gevent, um einige asynchrone Server zu erstellen, und es gibt eine Debatte darüber, wann Affepatching in Relation zu anderen Modulen durchgeführt werden soll. GEVENT Dokumentation zeigt Dinge wie diese:gevent monkey patchen order

from gevent import monkey 
monkey.patch_socket() 
import socket 

Wo der Affe Patchen geschieht, bevor die Bibliotheksmodule importiert wurden.

jedoch fühlt sich mein Manager die Reihenfolge der Affe Patchen sollte dies sein: Nach dem Bibliotheksmodul

import socket 
from gevent import monkey 
monkey.patch_socket() 

Wo Affe Patchen wird importiert genannt wird. Was es so aussehen lässt, als würde Affe-Patching das Socket-Modul importieren, und es zu diesem Zeitpunkt patchen.

Ich habe einige Diskussionen gefunden, die sagen, tun Sie es in eine Richtung, und andere, die sagen, es zu tun, die andere. Meine eigenen einfachen Tests scheinen zu sagen, dass es keine Rolle spielt. Hat jemand eine Meinung dazu, mit einigen klaren Gründen, oder Referenzen, die warum sagen?

Vielen Dank im Voraus! Doug

Antwort

0

Nun, nach dem Quellcode (siehe unten) patch_socketpatch_module nennt, die das socket Modul für Sie importiert.

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 

Siehe in gevent Repository auf GitHub.

Sie müssen also den Socket überhaupt nicht importieren (es sei denn, Sie verwenden ihn natürlich).

1

Als aktuelle Betreuer des GEVENT, werde ich zu the documentation hinweisen, die speziell sagt (multiple times), dass der empfohlene Weg zum Affen Patch ist es so früh wie möglich und vorzugsweise vor anderen Importen zu tun.

Jetzt, mit den meisten Standard-Bibliothek-Module können Sie mit Affe-Patching, nachdem sie importiert werden. Aber Bibliotheken von Drittanbietern sind auf diese Weise nicht unbedingt sicher. Im Allgemeinen ist es einfach sicherer und reduziert Probleme so schnell wie möglich.

+0

Danke für die "Smack Upside the Head", ich habe diese Dokumentation ein paar Mal gelesen, und war immer noch verwirrt wegen der Beispiele, die ich im Netz gesehen habe, die es sonst tun. Sollte den Dokumenten vertraut haben. :) –

+0

Hallo Jason, Bitte klären, was mit (Python 3.5.2 auf Linux) ** von gevent.monkey Import patch_all falsch ist; is_module_patched; patch_all(); Import-Socket; is_module_patched (socket) ** => _False_ – dvska

+1

'is_module_patched (modname)' nimmt ein Modul * name * nicht das Modul selbst. –