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
.
'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 –