2017-12-13 2 views
0

Betrachten Sie eine große Binärdatei large_file.pkl, die zu einem Objekt deserialisiert, das von some_function.py benötigt wird. Naiv, können wir large_file.pkl jedesmal some_function.py Deserialize ausführen (in meinem Fall jedes Mal, wenn eine Anfrage an den Flaschenserver gestellt wird), aber das wäre langsam und hindert uns daran, some_function.py in mehreren Threads gleichzeitig zu laufen. Gibt es eine pythonische Möglichkeit, large_file.pkl einmal zu deserialisieren, diese Objektinstanz im Speicher zu speichern und bei Bedarf in jedem Thread zu verwenden, der some_function.py läuft?Wie kann man Daten für mehrere Male und mehrere Threads auf einem Python-Server einmal deserialisieren?

Ich habe versucht, eine Datei unpickler.py, die im Wesentlichen dieses tut zu erstellen:

from pickle import load 
def create_global_large_object(): 
    global large_object 
    with open('large_file.pkl', 'rb') as f: 
     large_object = pickle.load(f) 

Dann nach dem Weg global Werke glaube ich, gehen Sie wie folgt ich das in some_function.py:

def run(): 
    ... 
    large_object.cool_method() 
    ... 

jedoch Wenn ich den folgenden Test durchführe:

from unpickler import create_global_large_object 
from some_function import run 
def test_idea(): 
    create_global_large_object() 
    run() 

Ich bekomme eine NameError: name 'large_object' is not defined.

Antwort

0

large_object ist ein weltweit im unpickler Modul, so dass es Sie import unpickler müssen von einem anderen Modul zugreifen zu können, und es so nennen:

unpickler.large_object.cool_method() 
+0

'large_object' nicht in' unpickler.py' definiert ist, es sei denn Wir rufen explizit 'create_global_lage_object()' auf, und wenn some_function.run() 'unpickler.create_global_lage_object()' ausführt, schlägt es den Zweck dieser Übung fehl, weil wir 'deserfialize.file.pkl' dadurch deserialisieren –