So verhindern Sie die Mehrfachinitialisierung der dynamischen Bibliothek

8

Ich arbeite an Python Version 2.7. Ich habe eine Modul-Erweiterung für Python in C geschrieben. Die Modulinitialisierungsfunktion PyMODINIT_FUNC initmymodule enthält einen Code zum Initialisieren der OpenSSL-Bibliothek. Mein Modul wurde als Shared Library erstellt und über imp.load_dynamic

geladen

Dieses Modul lädt möglicherweise viele Male und ich kann es nicht steuern. Django und Python machen das. Und wenn es zweimal lädt, ruft OPENSSL_config function auch zweimal auf. Und es führt zum Prozessabsturz.

Ich kann es nicht aus C-Code steuern, ich kann es nicht aus Python-Code steuern.

Hier sehen Sie sich die Dokumentation an Ссылка Es sagt:

  

imp.load_dynamic Lädt und initialisiert ein als implementiertes Modul   dynamisch ladbare shared library und gibt das Modulobjekt zurück. Wenn   das Modul wurde bereits initialisiert, es wird wieder initialisiert .

Nett.

Ich habe festgestellt, dass das ähnliche Problem in Python Version 3.4 gelöst wurde Ссылка

  

Module, die mehrere Initialisierungen unterstützen, setzen ihre m_size   Feld zu einer nicht negativen Zahl (Angabe der Größe der   modulspezifischer Zustand). Sie werden immer noch in den Erweiterungen gespeichert   Wörterbuch, um zu vermeiden, dass geteilte Bibliotheken zweimal geladen werden.

Aber was soll ich in Python 2.7 machen?

    
checkraise 20.05.2013, 15:07
quelle

2 Antworten

3

Vielleicht, um Abhilfe zu schaffen, indem Sie einen eigenen benutzerdefinierten Import-Hook registrieren, mit dem Sie den Fall steuern können, der Ihnen Probleme bereitet (doppelte Initialisierung). Einige Referenzen zum Schreiben von benutzerdefinierten Import-Hooks:

  • Python-Import-Hooks Artikel
  • PEP-302 Neue Import-Hooks - python 2.3 +
  • Erstellen und registrieren Sie benutzerdefinierte Import / Reload-Funktionen - Beispiel für die Implementierung im Projekt lazy_reload

Dies ist hackish Lösung, daher schlage ich besondere Vorsicht vor, wenn dies in Produktionssystemen verwendet werden soll.

    
Robert Lujo 20.05.2013 22:43
quelle
0

Ich habe die Ursache meines Problems gefunden. Es passiert, weil meine Django-Anwendung einen Treiber verwendet, um PostgreSQL zu verbinden, und dieser Treiber lädt die OpenSSL-Bibliothek. Es führt zu einem Konflikt, wie user315052 in diesem Kommentar

Ich denke, ich muss alle Krypto-Funktionen meiner Anwendung in einen separaten Prozess übernehmen.

    
checkraise 21.05.2013 20:01
quelle