Ich habe timeout
context manager, das perfekt mit Signalen funktioniert, aber es erhöht den Fehler im Multithread-Modus, da Signale nur im Haupt-Thread funktionieren.
Ich habe die Decorator-Implementierung von timeout
gesehen, aber ich weiß nicht, wie ich yield
innerhalb der Klasse weitergeben kann, die von threading.Thread
abgeleitet ist. Meine Variante wird nicht funktionieren.
Wenn der vom Context-Manager geschützte Code schleifenbasiert ist, sollten Sie die Behandlung von Thread-Kills in Betracht ziehen. Das Töten eines anderen Threads ist in der Regel unsicher. Daher besteht die Standardmethode darin, dass der steuernde Thread ein Flag setzt, das für den Arbeitsthread sichtbar ist. Der Worker-Thread überprüft dieses Flag regelmäßig und schließt sich selbst sauber ab. So können Sie etwas analoges zu Timeouts machen:
%Vor%Hier ist ein Beispiel für eine single-threaded Verwendung:
%Vor%und eine Multithread-Version:
%Vor%Dieser Ansatz ist aufdringlicher als die Verwendung von Signalen, aber er funktioniert für beliebige Threads.
Ich kann nicht sehen, wie Sie mit einem Kontextmanager vorgehen, was Sie vorschlagen. Sie können yield
nicht von einem Thread zum anderen leiten.
Was ich tun würde, ist Ihre Funktion mit einem interguable Thread mit dem Timeout zu umhüllen. Hier ist ein Rezept dafür.
Sie werden einen zusätzlichen Thread haben und die Syntax wird nicht so gut sein, aber es würde funktionieren.
Ich weiß, dass es spät ist, aber ich lese gerade erst, aber was ist mit der Erstellung eines eigenen Signal- / Kontextmanagers? Ich bin neu bei Python würde gerne Feedback von erfahrenen Entwicklern diese Implementierung.
Dies basiert auf der Antwort von "Mr. Fooz"
%Vor%Anwendungsfall:
%Vor%Timeouts für Systemaufrufe erfolgen mit Signalen. Die meisten blockierenden Systemaufrufe kehren mit EINTR zurück, wenn ein Signal auftritt, so dass Sie Alarme verwenden können, um Timeouts zu implementieren.
Hier ist ein Kontext-Manager, der mit den meisten Systemaufrufen arbeitet und bewirkt, dass IOError von einem blockierenden Systemaufruf ausgelöst wird, wenn es zu lange dauert.
%Vor%Tags und Links python timeout contextmanager time-limiting