2009-10-24 4 views
14

Ich muss einen Prozess ausführen, der in einer Django-Ansicht Stunden dauern kann. Ich muss den Status nicht kennen oder mit ihm kommunizieren, aber ich brauche diese Ansicht, um direkt nach dem Start des Prozesses umzuleiten.Wie startet man einen lang andauernden Prozess aus einer Django-Sicht?

Ich habe versucht, subprocess.Popen, verwenden Sie es in einem neuen threading.Thread, multiprocessing.Process. Der Elternprozess bleibt jedoch hängen, bis das Kind beendet wird. Der einzige Weg, fast wird es getan, ist mit einer Gabel. Offensichtlich ist das nicht gut, da es einen Zombie-Prozess zurücklässt, bis der Elternteil endet.

Das ist, was ich versuche, wenn Gabel zu tun:

if os.fork() == 0: 
    subprocess.Popen(["/usr/bin/python", script_path, "-v"]) 
else: 
    return HttpResponseRedirect(reverse('view_to_redirect')) 

So ist es eine Möglichkeit, einen völlig unabhängigen Prozess von einer Django-Ansicht mit minimalen Verlusten zu laufen? Oder mache ich etwas falsch?

+2

Duplizieren von all diesen: http://stackoverflow.com/search?q=%5Bpython%5D+long-running. http://stackoverflow.com/questions/1107826/python-long-running-daemon-job-processor, http://stackoverflow.com/questions/805120/python-task-server –

Antwort

10

Ich weiß nicht, ob das für Ihren Fall geeignet ist, aber hier ist was ich tue: Ich benutze eine Aufgabenwarteschlange (über ein Django-Modell); Wenn die Ansicht aufgerufen wird, gibt sie einen neuen Datensatz in die Aufgaben ein und leitet sie glücklich um. Aufgaben wiederum werden von cron unabhängig von django regelmäßig ausgeführt.

Bearbeiten: cron ruft den relevanten (und benutzerdefinierten) Django-Befehl auf, um die Aufgabe auszuführen.

5

Zunächst einmal - versuchen Sie, Cron für Ihre Aufgabe zu verwenden, so früh wie Shanyu.

Wenn es Ihnen nicht passt - dann versuchen Sie CeleryProject, für Task-Warteschlange für Django. Für die Arbeit verwendet RabbitMQ. Und hier ist ein wenig overview für die einfache Verwendung von Basing-Futures

Verwandte Themen