2016-09-26 2 views
1

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?

+0

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

Antwort

0
  • Zuerst sollten Sie Thread-Pool [1] ausprobieren.
  • Wenn das nicht so gut funktioniert, wie Sie möchten, senden Sie bitte ein Problem [2] und gehen Sie mit Multiprocessing als Workaround.

eventlet.tpool.execute(xlrd_read, file_path, other=arg)

meth in einem Python Gewinde führen die aktuellen Koroutine/greenthread, bis das Verfahren abgeschlossen ist blockiert. Der primäre Anwendungsfall hierfür ist das Umbrechen eines Objekts oder Moduls, das nicht für Monkeypatching oder einen der anderen Tricks geeignet ist, mit denen Eventlet kooperatives Nachgeben erzielt. Mit tpool können Sie solche Objekte zwingen, mit grünen Threads zu kooperieren, indem Sie sie in native Threads stecken, wobei einige Overhead-Kosten anfallen.

[1] http://eventlet.net/doc/threading.html

[2] https://github.com/eventlet/eventlet/issues

+0

Danke, das sieht nach einer praktikablen Lösung aus, aber ich denke, ich werde alle Monkeypatchings innerhalb des Threadpools entfernen müssen. Zumindest scheint es [this post] (https://bitbucket.org/eventlet/eventlet/pull-requests/29/fix-use-of-semaphore-with-tpool-issue-137/diff) zu zeigen. Ich bekomme einen ähnlichen Fehler von "kann Threads nicht wechseln". Ist das richtig? – damonology

+0

Wenn Sie einen Fehler bekommen, dann ist der Fehler, der im alten bitbucket Repo diskutiert wurde, vielleicht noch da, ja. Wenn ich Threads route, empfehle ich chirurgisches 'tpool.execute' nur bei blockierenden Funktionen wie' file.read'. – temoto

Verwandte Themen