Wenn Sie Futures auf dask.distributed verwenden, gibt es eine Möglichkeit, zwischen pending
Futures zu unterscheiden, die derzeit evaluiert werden immer noch in der Warteschlange?So unterscheiden Sie zwischen wartenden und laufenden Futures (und killen Futures, die zu lange ausgeführt wurden)
Der Grund ist, dass ich eine große Anzahl von Aufgaben (~ 8000) an eine kleinere Gruppe von Arbeitern (100) übergebe, so dass nicht alle Aufgaben sofort bearbeitet werden können. Die Aufgaben umfassen das Aufrufen einer ausführbaren Datei eines Drittanbieters (übersubprocess.check_output
), die in seltenen Fällen in eine Endlosschleife übergeht.
Daher möchte ich Futures, die zu lange ausgeführt wurden (mit einem willkürlichen Timeout) abbrechen. Es scheint jedoch keine Möglichkeit zu geben, festzustellen, ob sich eine Zukunft für lange Zeit in einem Zustand befindet, in dem Berechnungen länger dauern als gewöhnlich oder einfach deshalb, weil sie auf die Verfügbarkeit eines Arbeiters warten mussten.
Mein Setup umfasst einen SGE-Cluster, der ein dask-scheduler
bzw. dask-worker
Job/Job-Array ausführt. Ich habe versucht, einen Timeout direkt in der eingereichten Python-Funktion einstellen, @timeout_decorator.timeout(60, use_signals=False)
vom timeout_decorator package mit, bekam aber den folgenden Fehler:
"daemonic processes are not allowed to have children"
Jede Hilfe sehr geschätzt werden würde.
Danke für die schnelle Antwort. Ich führe Python 2 aus, wo "subprocess" das Schlüsselwort "timeout =" fehlt, aber ich konnte den gleichen Effekt mit dem Code in meiner Antwort unten erzielen. Das ist jedoch ein umsetzungsspezifisches Detail, deshalb markiere ich diese Antwort als die richtige. – user3098840