Meine Anwendung, die Websockets verwendet, verwendet auch mehrere Python-Module von Drittanbietern, die scheinbar so geschrieben sind, dass der Rest der Anwendung beim Aufruf blockiert wird. Zum Beispiel verwende ich xlrd, um Excel-Dateien zu analysieren, die ein Benutzer hochgeladen hat.Verwenden von Python-Modul von Drittanbietern, die Flask-Anwendung blockiert
Ich habe Affe die builtins wie dies in den ersten Zeilen der Anwendung gepatcht:
import os
import eventlet
if os.name == 'nt':
eventlet.monkey_patch(os=False)
else:
eventlet.monkey_patch()
Dann benutze ich die folgende Aufgabe zu starten, die Anrufe zu xlrd enthält.
socketio.start_background_task(my_background_task)
Was ist der geeignete Weg, diese anderen Module jetzt aufzurufen, damit meine Anwendung reibungslos funktioniert? Ist das Modul multiprocessing ein anderer Prozess innerhalb des begrünten Threads der richtige Weg zu starten?
Ich inspizierte kurz den Code für xlrd und auf den ersten Blick ich sehe nichts drin, die mit eventlet in Konflikt geraten können. Weißt du genau, wo der Hang passiert? Funktioniert alles gut, wenn Sie Eventlet deinstallieren, um den regulären Threading-Modus zu erzwingen? – Miguel